2
        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 フレームワークを使用しています

4

2 に答える 2

2

行にコメントすると、タスクが開始される前にキャンセルされる可能性があります。したがって、例外が発生します。スリープを追加すると、ほとんどが開始されるため、呼び出しでタスク内でキャンセルが発生しますThrowIfCancellationRequested

于 2013-05-17T05:49:26.623 に答える