2
Winformアプリケーションをビルドしていて、ディレクトリツリーを表すTreeViewを更新したいと考えています。このメソッドは1〜2秒かかるので、私はそれを並行して実行したい。タスクの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