El subproceso de llamada debe ser STA, porque muchos componentes de la interfaz de usuario requieren esto

174

Estoy usando http://www.codeproject.com/KB/IP/Facebook_API.aspx

Estoy tratando de llamar al XAML que se crea usando WPF . Pero me da un error:

El subproceso de llamada debe ser STA, porque muchos componentes de la interfaz de usuario requieren esto.

No se que hacer. Estoy tratando de hacer esto:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList();

Pero me está dando ese error.

Agregué un trabajador de fondo:

static BackgroundWorker bw = new BackgroundWorker();

static void Main(string[] args)
{
    bw.DoWork += bw_DoWork;
    bw.RunWorkerAsync("Message to worker");
    Console.ReadLine();
}

static void bw_DoWork(object sender, DoWorkEventArgs e)
{
    // This is called on the worker thread
    FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList();

    Console.WriteLine(e.Argument);        // Writes "Message to worker"

    // Perform time-consuming task...
}
C..
fuente

Respuestas:

223

Intente invocar su código del despachador :

Application.Current.Dispatcher.Invoke((Action)delegate{
      // your code
});
Amjad Abdelrahman
fuente
¡Sí, ustedes me salvaron la vida!
Alex McManns
11
Esta es la verdadera respuesta. Puedes hackear la estupidez de la ventana de WPF con esto.
Andrew
77
Y similar a esto, si estás usando MVVMLight puedes usarloDispatcherHelper.CheckBeginInvokeOnUI(Action action)
TimothyP
Este problema parecía complicado y frustrado, ¡pero esta toma es realmente genial! Muchas gracias !
Kay Lee
44
@ Andrew No es estupidez, simplemente estás intentando acceder al hilo de la interfaz de usuario desde un hilo de fondo.
Krusty
139

Si realiza la llamada desde el hilo principal, debe agregar el atributo STAThread al método Main, como se indicó en la respuesta anterior.

Si utiliza un subproceso independiente, debe estar en un STA (apartamento de subproceso único), que no es el caso de subprocesos de trabajo en segundo plano. Tienes que crear el hilo tú mismo, así:

Thread t = new Thread(ThreadProc);
t.SetApartmentState(ApartmentState.STA);

t.Start();

con ThreadProc siendo un delegado de tipo ThreadStart.

Timores
fuente
2
¿Puede esto (usando STA) tener efectos secundarios?
Louis Rhys
10
El principal efecto secundario de ser STA es que las devoluciones de llamada COM simultáneas se serializan. Si no está utilizando devoluciones de llamada COM, no debería importar.
Timores
¡Salvó mi vida! ¡Pude usar esto en una aplicación WPF que alojaba una API local para una integración entre dos aplicaciones diferentes!
schizoid04
18

también puedes probar esto

// create a thread  
Thread newWindowThread = new Thread(new ThreadStart(() =>  
{  
    // create and show the window
    FaxImageLoad obj = new FaxImageLoad(destination);  
    obj.Show();  

    // start the Dispatcher processing  
    System.Windows.Threading.Dispatcher.Run();  
}));  

// set the apartment state  
newWindowThread.SetApartmentState(ApartmentState.STA);  

// make the thread a background thread  
newWindowThread.IsBackground = true;  

// start the thread  
newWindowThread.Start();  
atik sarker
fuente
Gracias. Esto ayudará cuando se use la clase Applicationcontext en lugar de Form.
SaddamBinSyed
Estoy abriendo un nuevo formulario cuando se hace clic en un botón como lo hago en muchos otros lugares. ¿Alguna idea de por qué solo uno de esos lugares arroja este error?
Paul McCarthy
17

Sospecho que está recibiendo una devolución de llamada a un componente de la interfaz de usuario desde un subproceso en segundo plano. Le recomiendo que haga esa llamada utilizando un BackgroundWorker, ya que este es un subproceso de interfaz de usuario.

Para el BackgroundWorker, el programa principal debe estar marcado como [STAThread].

Sangha Preet
fuente
1
Intenté agregarlo, como se indicó anteriormente, pero aún me da el error: /
C ..
No estoy familiarizado con el código. ¿Puede depurar y descubrir exactamente la línea de código que causa esto?
Saluda a Sangha
3

¡Simplemente marque su programa con el [STAThread]atributo y el error desaparecerá! Es magia :)

LiRoN
fuente
1

Para mí, este error ocurrió debido a que se pasó un parámetro nulo. Verificar los valores de las variables solucionó mi problema sin tener que cambiar el código. Usé BackgroundWorker.

Ryan Loggerythm
fuente
-3

Si llama a una nueva declaración de UI de ventana en un hilo existente, arroja un error. En lugar de eso, cree un nuevo hilo dentro del hilo principal y escriba la declaración de la interfaz de usuario de la ventana en el nuevo hilo hijo.

Balvant Ramani
fuente
¿Cómo escribir PLS explicar?
Tushar Gupta - curioustushar