O segmento de chamada deve ser STA, porque muitos componentes de interface do usuário exigem

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

Eu estou tentando chamar o XAML que é criado usando o WPF . Mas isso me dá um erro:

O segmento de chamada deve ser STA, porque muitos componentes de interface do usuário exigem isso.

Eu não sei o que fazer. Eu estou tentando fazer isso:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); 

Mas está me dando esse erro.

Eu adicionei um trabalhador de segundo plano:

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

Tente invocar seu código do despachante :

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

Se você fizer a chamada do thread principal, você deve adicionar o atributo STAThread ao método Main, conforme indicado na resposta anterior.

Se você usar um thread separado, ele precisa estar em um STA (single-threaded apartment), o que não é o caso dos threads de trabalho em segundo plano. Você tem que criar o segmento você mesmo, assim:

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

com ThreadProc sendo um delegado do tipo ThreadStart.

Eu suspeito que você está recebendo um retorno de chamada para um componente de interface do usuário de um segmento de plano de fundo. Eu recomendo que você faça essa chamada usando um BackgroundWorker como este é consciente do segmento de interface do usuário.

Para o BackgroundWorker, o programa principal deve ser marcado como [STAThread].

Você também pode tentar isso

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

Application.Current.Dispatcher.Invoke ((Action) delegate {// coloque o código aqui});

Para mim, esse erro ocorreu devido a um parâmetro nulo sendo passado. Verificar os valores das variables ​​corrigiu meu problema sem ter que alterar o código. Eu usei o BackgroundWorker.

Se você chamar uma nova instrução de interface de usuário de janela em um thread existente, isso gerará um erro. Em vez disso, crie um novo thread dentro do thread principal e escreva a instrução de UI da janela no novo thread filho.