wpf - El hilo de llamada debe ser STA, porque muchos componentes de UI requieren esto
xaml multithreading (7)
Application.Current.Dispatcher.Invoke ((Acción) delegate {// poner código aquí});
Estoy usando http://www.codeproject.com/KB/IP/Facebook_API.aspx
Intento llamar al XAML que se crea usando WPF . Pero me da un error:
El hilo que llama debe ser STA, porque muchos componentes de UI lo requieren.
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...
}
Intente invocar su código desde el dispatcher :
Application.Current.Dispatcher.Invoke((Action)delegate{
// your code
});
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.
Si llama a una nueva declaración de UI 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.
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 utiliza 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 tú mismo, así:
Thread t = new Thread(ThreadProc);
t.SetApartmentState(ApartmentState.STA);
t.Start();
con ThreadProc siendo un delegado de tipo ThreadStart.
Sospecho que recibes una devolución de llamada a un componente de UI desde un hilo de fondo. 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 [STATread].
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();