バックグラウンドスレッドで長時間実行される操作(OSによって発生するイベントのリッスンなど)を実行したい。ほとんどの場合、動作は問題なく継続して実行されます。しかし、特定のまれな状況では、OSレベルのAPIがエラーコードを送信し、アプリケーションのユーザーに表示するためにメインスレッドに伝播する必要があるバックグラウンドスレッドから例外を発生させる必要がありWinFrom
ます。
これに使うことにしBackgroundWorker
ました。しかし、.NET 4.0は、TPLのさまざまなブログによると、より優れたオプションであるTask
クラスを提供します。Task Parallel Library
私のアプリケーションでは、実際のフォームが表示される前に、バックグラウンドタスクを開始する必要があります。実際のコードは非常に複雑なので、リアルタイムの問題をシミュレートするサンプルコードをいくつか作成しました。
public static Task task;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
ThreadTest tt = new ThreadTest();
task = new Task(() => tt.PerformTask("hi"));
task.Start();
try
{
task.Wait();
}
catch (AggregateException aggregateException)
{
// Handle exception here.
}
Application.Run(new Form1());
}
このコードでは、バックグラウンドタスクが例外なく実行され続け、task.Wait()
呼び出しによって現在のスレッドがバックグラウンドタスクが終了するまで待機するという理由だけで、メインフォームが表示されることはありません。
メインスレッドがバックグラウンドタスクが終了するまで待機するべきではないが、同時に、バックグラウンドタスクから例外が発生するたびに例外の詳細を取得する必要があるようなシナリオにTPL
を使用できますか?Task
上記のコードでは、解決策の1つは、後の段階でタスク作成コードを移動することです。しかし、この場合、私の質問はより学術的です。