2009-09-06 52 views
0

没有完成我有一个主线程上启动,如图 alt text http://www.developingtrends.co.uk/runworker.jpg后台工作的GUI线程

它如预期 alt text http://www.developingtrends.co.uk/dowork.jpg

执行一个工作线程,但出于某种原因后台工作它在工作线程上完成,如果我尝试更新GUI线程上的任何东西,会导致我遇到问题。 alt text http://www.developingtrends.co.uk/runworkercomplete.jpg

我已经尝试了简化的安装上一个测试应用程序,并在此应用程序线程也主线程 alt text http://www.developingtrends.co.uk/testapp.jpg

你能想到的任何理由,正确地结束这场可能发生?

感谢

罗斯

+0

在哪里以及如何设置事件?检查测试应用程序和其他应用程序的差异。 – nos 2009-09-06 19:39:37

+0

它在InitializeComponent方法上的设置(我已经检查并且按照预期在主线程上运行) – 2009-09-07 07:34:31

回答

1

在较早版本的Windows窗体中可以看到此行为。即使BGW在主线程中启动,SynchronizationContext.Current的值为null。这个错误在去年的某个时候得到了修复。

从我的博客:创建为主题的第一Win32的窗口句柄时

Windows窗体将只安装WindowsFormsSynchronizationContext。特别是,通过主窗体的构造函数和Load事件,SynchronizationContext.Current为null。然而,在Show事件被调用时,它将被设置。一种常见的解决方法是强制创建Win32窗口句柄(通过阅读Handle属性),该句柄安装了适当的SynchronizationContext作为副作用。

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

0

不知道为什么这个happeneds。但是,如果要处理结果,请尝试以下操作:

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; 
     } 
    } 
+0

看起来应该可以工作,但它仍然在工作线程上。不知道发生了什么事! – 2009-09-06 21:58:51