.NET 4.0を使用した並列プログラミングに関して、私が何をしているのかは明らかにわかりません。私は、いくつかの無意識の作業を行うタスクを開始する単純なWindowsアプリを持っています(数値1〜1000を出力します)。長時間実行されるプロセスをシミュレートするために、途中でかなりの一時停止を行いました。この長い一時停止が行われているときに、[停止]ボタンを押すと、そのイベントハンドラーがCancellationTokenSourceのCancelメソッドを呼び出します。キャンセルされたタスクが現在の反復で完了するまで、[停止]ボタンのイベントハンドラーでそれ以上の処理(この場合はメッセージの出力)を実行したくありません。どうすればよいですか?[停止]ボタンのイベントハンドラーでTask.WaitAllなどを使用しようとしましたが、未処理のAggregateExceptionがスローされます。上記のように実行した場合に私の問題を説明するのに役立つコードは次のとおりです。
private Task t;
private CancellationTokenSource cts;
public Form1()
{
InitializeComponent();
}
private void startButton_Click(object sender, EventArgs e)
{
statusTextBox.Text = "Output started.";
// Create the cancellation token source.
cts = new CancellationTokenSource();
// Create the cancellation token.
CancellationToken ct = cts.Token;
// Create & start worker task.
t = Task.Factory.StartNew(() => DoWork(ct), ct);
}
private void DoWork(CancellationToken ct)
{
for (int i = 1; i <= 1000; i++)
{
ct.ThrowIfCancellationRequested();
Thread.Sleep(10); // Slow down for text box outout.
outputTextBox.Invoke((Action)(() => outputTextBox.Text = i + Environment.NewLine));
if (i == 500)
{
Thread.Sleep(5000);
}
}
}
private void stopButton_Click(object sender, EventArgs e)
{
cts.Cancel();
Task.WaitAll(t); // this doesn't work :-(
statusTextBox.Text = "Output ended.";
}
private void exitButton_Click(object sender, EventArgs e)
{
this.Close();
}
これに関する助けをいただければ幸いです。前もって感謝します。