背景工作没有在gui线程上完成

时间:2009-09-06 19:35:56

标签: backgroundworker

我有一个后台工作程序,它在主线程上启动,如图所示 alt text
(来源:developingtrends.co.uk

它按预期在工作线程上执行 alt text
(来源:developingtrends.co.uk

但由于某种原因它在工作线程上完成,如果我尝试更新gui线程上的任何内容,这会导致我的问题。 alt text
(来源:developingtrends.co.uk

我在测试应用程序上尝试了简化设置,在此应用程序中,线程在主线程上正确结束 alt text
(来源:developingtrends.co.uk

你能想出这可能发生的任何原因吗?

由于

罗斯

2 个答案:

答案 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;
        }
    }