我正在使用http://www.codeproject.com/KB/IP/Facebook_API.aspx
我试图调用使用WPF创建的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...
}
小智.. 192
尝试从调度程序调用您的代码:
Application.Current.Dispatcher.Invoke((Action)delegate{ // your code });
这是*真正的答案.你可以用这个来破解WPF的窗口愚蠢. (10认同)
与此类似,如果您碰巧使用MVVMLight,您可以使用`DispatcherHelper.CheckBeginInvokeOnUI(Action action)` (7认同)
@Andrew这不是愚蠢,您只是在尝试从后台线程访问UI线程。 (2认同)
Timores.. 133
如果从主线程进行调用,则必须将STAThread属性添加到Main方法,如上一个答案中所述.
如果使用单独的线程,则需要在STA(单线程单元)中,而后台工作线程不是这种情况.你必须自己创建线程,如下所示:
Thread t = new Thread(ThreadProc);
t.SetApartmentState(ApartmentState.STA);
t.Start();
ThreadProc是ThreadStart类型的委托.
尝试从调度程序调用您的代码:
Application.Current.Dispatcher.Invoke((Action)delegate{ // your code });
如果从主线程进行调用,则必须将STAThread属性添加到Main方法,如上一个答案中所述.
如果使用单独的线程,则需要在STA(单线程单元)中,而后台工作线程不是这种情况.你必须自己创建线程,如下所示:
Thread t = new Thread(ThreadProc);
t.SetApartmentState(ApartmentState.STA);
t.Start();
ThreadProc是ThreadStart类型的委托.
我怀疑你是从后台线程获得UI组件的回调.我建议您使用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();