我有一个后台工作程序,它在主线程上启动,如图所示
(来源:developingtrends.co.uk)
它按预期在工作线程上执行
(来源:developingtrends.co.uk)
但由于某种原因它在工作线程上完成,如果我尝试更新gui线程上的任何内容,这会导致我的问题。
(来源:developingtrends.co.uk)
我在测试应用程序上尝试了简化设置,在此应用程序中,线程在主线程上正确结束
(来源:developingtrends.co.uk)
你能想出这可能发生的任何原因吗?
由于
罗斯
答案 0 :(得分:1)
在旧版本的Windows窗体中可以看到此行为。即使BGW是在主线程上启动的,SynchronizationContext.Current
的值也是null
。这个错误在去年的某个时候得到了解决。
来自我的博客:
Windows窗体只会在创建该线程的第一个Win32窗口句柄时安装WindowsFormsSynchronizationContext。特别是,SynchronizationContext.Current通过主窗体的构造函数和Load事件为null。但是,它会在调用Show事件时设置。一个常见的解决方法是强制创建Win32窗口句柄(通过读取Handle属性),该句柄安装了正确的SynchronizationContext作为副作用。
幸运的是,不再需要这种黑客攻击。在去年的某个时候,微软发布了一个更新,将该问题一直修复回.NET 2.0 Windows Forms项目。我不确定是哪个更新。
答案 1 :(得分:0)
不知道为什么会这样。但是,如果要处理结果,请尝试以下操作:
void a_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
ProcessResult((string) e.Result);
}
public delegate void ProcessResultDelegate(string result);
void ProcessResult(string result)
{
if (textBox1.InvokeRequired)
{
var d = new ProcessResultDelegate(ProcessResult);
d.Invoke(result);
}
else
{
textBox1.Text = result;
}
}