2010-02-24 95 views
109

estoy usando http://www.codeproject.com/KB/IP/Facebook_API.aspxEl subproceso de llamada debe ser STA, debido a que muchos componentes de interfaz de usuario requieren este

Estoy tratando de llamar a la XAML que se ha creado usando WPF. Pero me da un error:

The calling thread must be STA, because many UI components require this.

No sé qué hacer. Estoy tratando de hacer esto:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); 

Pero me está dando ese error.

he añadido 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... 
} 

Respuesta

15

Sospecho que está recibiendo una devolución de llamada a un componente de interfaz de usuario desde un subproceso en segundo plano. Te recomiendo que hagas esa llamada usando un BackgroundWorker ya que este es un thread thread.

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

+0

Intenté agregarlo, como arriba, pero todavía me da el error:/ –

+0

No soy familliar con el código. ¿Puedes depurar y descubrir exactamente la línea de código que causa esto? –

121

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

Si usa un hilo separado, debe estar en un STA (apartamento de subproceso único), que no es el caso para los subprocesos de trabajo en segundo plano. Tienes que crear el hilo a sí mismo, así:

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

t.Start(); 

con ThreadProc ser un delegado de tipo ThreadStart.

+2

¿puede esto (usar STA) tener un efecto secundario? –

+9

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

-2

Si llama a una nueva instrucción de IU de ventana en una secuencia existente, arroja un error. En lugar de eso, cree un nuevo subproceso dentro del subproceso principal y escriba la instrucción de UI de ventana en el nuevo subproceso secundario.

+0

cómo escribir los pls explicar? –

0

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

119

intentar invocar el código de la dispatcher:

Application.Current.Dispatcher.Invoke((Action)delegate{ 

//your code 

}); 
+0

Yeahhh, ustedes salvan mi vida !! –

+6

Esta es la respuesta * real *. Puede piratear la estupidez de la ventana de WPF con esto. – Andrew

+5

Y similar a esto, si usted está usando MVVMLight puede usar 'DispatcherHelper.CheckBeginInvokeOnUI (Action action)' – TimothyP

4

También puede probar este

// 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(); 
+0

No es necesario un nuevo subproceso, simplemente invoque el subproceso de interfaz de usuario. – rolls

3

Application.Current.Dispatcher.Invoke ((Acción) delegado {// ponga código aquí });

+0

Esto es lo mismo que esta respuesta: https://stackoverflow.com/a/21539361/732673 –

Cuestiones relacionadas