假设我像这样BackgroundWorker
private void RunBackgroundWorker(object sender, DoWorkEventArgs e)
{
// Do something lengthy here
// which takes a lot of time
}
private void BackgroundWorkerCompleted(object sender, RunWorkerCompletedEventArgs)
{
System.Threading.Thread.Sleep(2000) ;
BackgroundWorker1.RunWorkerAsync() ;
}
我想问一下BackgroundWorkerCompleted
函数的内容是在“后台”线程还是主UI线程上执行的。我问这个是因为,我正在创建一个桌面应用程序,它使用数据库并且每隔几秒就会不断更新它的数据库
答案 0 :(得分:2)
它在UI线程上执行。 MSDN解释说:
您必须小心不要操作DoWork事件处理程序中的任何用户界面对象。而是通过ProgressChanged和 RunWorkerCompleted 事件与用户界面进行通信。
也就是说,Servy在评论中是正确的 - 你应该使用Timer
来执行代码间隔,不 a BackgroundWorker
。
答案 1 :(得分:1)
我经常使用BackgroundWorker
并且可以判断在{i>}事件是肯定在UI线程中运行。此外,您可以将RunWorkerCompleted
结果传递到相应的eventArgs字段,然后在DoWork
中从eventArgs获取它以执行一些与UI相关的操作,如上所述here