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...
}

Respuestas:


223

Intente invocar su código del despachador :

Application.Current.Dispatcher.Invoke((Action)delegate{
      // your code
});

¡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.


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();  

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].


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 :)


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.


-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.


¿Cómo escribir PLS explicar?
Tushar Gupta - curioustushar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.