调用线程必须是STA,因为许多UI组件都需要这个

我正在使用http://www.codeproject.com/KB/IP/Facebook_API.aspx

我正在尝试调用使用WPF创build的XAML 。 但它给了我一个错误:

调用线程必须是STA,因为许多UI组件都需要这个。

我不知道该怎么办。 我正在尝试这样做:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); 

但它给了我这个错误。

我添加了一个后台工作者:

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

如果您从主线程调用,则必须将STAThread属性添加到Main方法中,如前面的答案中所述。

如果您使用单独的线程,则需要位于STA(单线程单元)中,而后台工作线程则不是这种情况。 你必须自己创build线程,就像这样:

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

ThreadProc是ThreadStarttypes的委托。

尝试从调度程序调用您的代码:

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

我怀疑你是从后台线程获取一个UI组件的callback。 我build议你使用BackgroundWorker进行调用,因为这是UI线程感知的。

对于BackgroundWorker,主程序应该标记为[STAThread]。

你也可以试试这个

 // 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 {//把代码放在这里});

对我来说,这个错误发生是因为传递了一个空参数。 检查variables值解决了我的问题,而不必更改代码。 我使用了BackgroundWorker。

如果您在现有线程中调用新窗口UI语句,则会引发错误。 而不是在主线程中创build一个新线程,并将窗口UI语句写入新的子线程。