我用的是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...
}

当前回答

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

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

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

t.Start();

ThreadProc是ThreadStart类型的委托。

其他回答

如果在现有线程中调用new window UI语句,它将抛出一个错误。相反,在主线程中创建一个新线程,并在新的子线程中编写window UI语句。

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

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

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

t.Start();

ThreadProc是ThreadStart类型的委托。

如果应用程序。例如,通过单元测试Current为空,您可以尝试这样做:

 System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke( YOUR action )

在我的例子中,我想从控制台应用程序启动一个WPF窗口。简单地用[STAThread]设置Main方法不起作用。

蒂莫雷斯和穆罕默德的回答对我很有帮助:

private static void StaThreadWrapper(Action action)
{
    var t = new Thread(o =>
    {
        action();
        System.Windows.Threading.Dispatcher.Run();
    });
    t.SetApartmentState(ApartmentState.STA);
    t.Start();
}

使用示例:

StaThreadWrapper(() =>
{
    var mainWindow = new MainWindow();
    mainWindow.Show();
});

试着从dispatcher调用你的代码:

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