2012-03-01 67 views
2

我正在構建一個Winform應用程序,我想更新一個表示目錄樹的TreeView。這個方法需要一兩秒鐘,所以我想要並行運行它。在System.Windows.Forms.dll中發生'System.InvalidOperationException'任務

首先我使用一個Task.Factory.StartNew()與此代碼下面,但我收到錯誤'System.InvalidOperationException' occurred in System.Windows.Forms.dll in Task

Task loadTreeViewTask = Task.Factory.StartNew(() => 
     { 
      try { 
       directoryTreeView.Nodes.Clear(); 
       .... 
       PopulateTreeView(directory, directoryTreeView.Nodes[0]); 
      } 
      catch (Exception e) { 
       //Log 
       //Change try/catch to CancellationToken 
      } 
     }); 

然後我看到了Windows的作品與單個線程的UI,並且我發現我需要使用InvokeRequired:

directoryTreeView.Invoke((MethodInvoker)(() => 
{ 
    try { 
    directoryTreeView.Nodes.Clear(); 
    .... 
    PopulateTreeView(directory, directoryTreeView.Nodes[0]); 
    } 
    catch (Exception e) { 
    //Log 
    //Change try/catch to CancellationToken 
    } 
})); 

有一種更好的方式來做到這一點?

+1

當你編寫一個在後臺工作更困難的模型類時,事情會變得最糟糕,並最終在某些檢查點上調用它自己的事件。你絕對不知道如何使用事件。如果有人爲了更新視圖而使用某個事件,則會陷入同樣的​​尷尬境地。你做事顯然是正確的。另一端也正確使用事件,但是你的模型是基於線程的,並且bigbang發生了...... – Sebastian 2012-09-11 20:50:53

回答

1

您的代碼的第一部分將無法正常工作,因爲您嘗試更新在UI線程上創建的控件,因此,您需要使用Invoke方法。您無法更新從另一個線程在UI線程上創建的UI控件。

相關問題