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