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

问题描述 投票:0回答:2

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

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

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

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

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

谢谢

罗斯

backgroundworker
2个回答
1
投票

在旧版本的Windows窗体中可以看到此行为。即使BGW是在主线程上启动的,SynchronizationContext.Current的值也是null。这个bug在去年的某个时候被修复了。

来自我的博客:

Windows窗体只会在创建该线程的第一个Win32窗口句柄时安装WindowsFormsSynchronizationContext。特别是,SynchronizationContext.Current通过主窗体的构造函数和Load事件为null。但是,它会在调用Show事件时设置。一个常见的解决方法是强制创建Win32窗口句柄(通过读取Handle属性),该句柄安装了正确的SynchronizationContext作为副作用。

幸运的是,不再需要这种黑客攻击。在去年的某个时候,微软发布了一个更新,将该问题一直修复回.NET 2.0 Windows Forms项目。我不确定是哪个更新。


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;
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.