我用的是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方法,错误就会消失!这是魔法:)

例子:

class Program {
    [STAThread]
    static void Main(string[] args) {
    // My code here
    }
}

其他回答

另一种情况,如果你可能遇到,选择窗口新建和显示。 不要在App.xaml.cs的App()或OnStartup()中做出选择,而是在Startup事件中做出选择。

// App.xaml.cs
        private App()
        {
            Window window = CheckSession() ? new InstallWindow() : (Window)new LoginWindow();
            window.Show(); // bad 1
        }

        protected override void OnStartup(StartupEventArgs e)
        {
            Window window = CheckSession() ? new InstallWindow() : (Window)new LoginWindow();
            window.Show(); // bad 2

            base.OnStartup(e);
        }

下面应该不错

// App.xaml.cs
        private App()
        {
            Startup += Application_Startup;
        }

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            Window window = CheckSession() ? new InstallWindow() : (Window)new LoginWindow();
            window.Show();  // good
        }

还记得从App.xaml中删除StartupUri

<!--App.xaml-->
<Application StartupUri="MainWindow">
<!--remove StartupUri-->
</Application>

或者在这里添加事件也可以。

<!--App.xaml-->
<Application Startup="Application_Startup">

</Application>
// App.xaml.cs
        private App()
        {
            
        }

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            Window window = CheckSession() ? new InstallWindow() : (Window)new LoginWindow();
            window.Show();  // good
        }

试着从dispatcher调用你的代码:

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

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

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

你也可以试试这个

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

只要用[STAThread]属性标记程序的Main方法,错误就会消失!这是魔法:)

例子:

class Program {
    [STAThread]
    static void Main(string[] args) {
    // My code here
    }
}