当前位置:  开发笔记 > 开放平台 > 正文

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

如何解决《调用线程必须是STA,因为许多UI组件都需要这个》经验,为你挑选了4个好方法。

我正在使用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类型的委托.



1> 小智..:

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

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


这是*真正的答案.你可以用这个来破解WPF的窗口愚蠢.
与此类似,如果您碰巧使用MVVMLight,您可以使用`DispatcherHelper.CheckBeginInvokeOnUI(Action action)`
@Andrew这不是愚蠢,您只是在尝试从后台线程访问UI线程。

2> Timores..:

如果从主线程进行调用,则必须将STAThread属性添加到Main方法,如上一个答案中所述.

如果使用单独的线程,则需要在STA(单线程单元)中,而后台工作线程不是这种情况.你必须自己创建线程,如下所示:

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

t.Start();

ThreadProc是ThreadStart类型的委托.


STA的主要副作用是同时进行COM回调序列化.如果你没有使用COM回调,那应该没关系.
这个(使用STA)可能有副作用吗?

3> Preet Sangha..:

我怀疑你是从后台线程获得UI组件的回调.我建议您使用BackgroundWorker进行该调用,因为这是UI线程感知.

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



4> atik sarker..:

你也可以试试这个

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

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有