2009-09-06 64 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