var tokenSource2 = new CancellationTokenSource();
CancellationToken ct = tokenSource2.Token;
var task = Task.Factory.StartNew(() => {
Thread.Sleep(4000);
Console.WriteLine("Done");
ct.ThrowIfCancellationRequested();
}, ct);
Thread.Sleep(1000); Look here! <---
tokenSource2.Cancel();
try
{
Console.WriteLine("Wait");
task.Wait();
}
catch (Exception e)
{
Console.WriteLine("Task was canceled");
}
この行にコメントするとすべて正常に動作し、メインスレッドで例外がキャッチされる理由がわかりませんが、この行を離れると、ct.ThrowIfCancellationRequested(); の行の子スレッドで例外がスローされます。どちらの場合も、キャンセル トークンのインスタンスは 1 つあります。私はマルチスレッドの初心者なので、間違いなく何かが恋しいです。
次のコードを試しました
static void Main(string[] args)
{
Thread.CurrentThread.Name = "Main";
Console.WriteLine("Name of the current thread is " + Thread.CurrentThread.Name);
var tokenSource2 = new CancellationTokenSource();
CancellationToken ct = tokenSource2.Token;
var task = Task.Factory.StartNew(() =>
{
Thread.Sleep(4000);
Console.WriteLine("Done");
try
{
ct.ThrowIfCancellationRequested(); // If I remove the try/catch here will be unhandled exception
}
catch (OperationCanceledException exp)
{
Console.WriteLine("Task was started then canceled");
}
}, ct);//ontinueWith(OnProcessImageEnded);
Thread.Sleep(1000);
tokenSource2.Cancel();
try
{
Console.WriteLine("Wait");
task.Wait();
}
catch (Exception e)
{
Console.WriteLine("Task was canceled");
}
Console.WriteLine("Task was finished");
Console.WriteLine(task.Status);
現在、タスクのスレッドで例外を処理していますが、タスクの Status が Canceled に設定されていません。タスクが例外をキャッチして処理できないためだと思います。正しい方法は何ですか?
http://msdn.microsoft.com/en-us/library/ee191553.aspxこの例を見つけましたが、同じ問題があります。実行中に「c」を押すと、externalToken.ThrowIfCancellationRequested(); を呼び出して再スローしようとすると、未処理の例外がスローされます。... まったく混乱しています。x64 Win 7、4.5 .net フレームワークを使用しています