2

C#でのAdamFreemanのPro.NET4並列プログラミングのVisualStudio 2012 Listing_07でコンソールアプリケーションを実行しているときに、タスクをキャンセルしようとすると例外が発生します。OperationCanceledExceptionタスクでキャンセルの試みが検出されたときにスローしている(またはそう思われる)ので、私にはこれの理由について大きな謎はないようです。

これはバグですか、それとも何かが足りませんか?問題は基本的に彼のすべてのタスクキャンセルの例で発生しています!本が店に来てから(2010年)、タスクライブラリの何かが変更されたとしか思えませんか?

// create the cancellation token source
CancellationTokenSource tokenSource
    = new CancellationTokenSource();

// create the cancellation token
CancellationToken token = tokenSource.Token;

// create the task
Task task = new Task(() => {
    for (int i = 0; i < int.MaxValue; i++) {
        if (token.IsCancellationRequested) {
            Console.WriteLine("Task cancel detected");
            throw new OperationCanceledException(token);
        } else {
            Console.WriteLine("Int value {0}", i);
        }
    }
}, token);

// wait for input before we start the task
Console.WriteLine("Press enter to start task");
Console.WriteLine("Press enter again to cancel task");
Console.ReadLine();

// start the task
task.Start();

// read a line from the console.
Console.ReadLine();

// cancel the task
Console.WriteLine("Cancelling task");
tokenSource.Cancel();

// wait for input before exiting
Console.WriteLine("Main method complete. Press enter to finish.");
Console.ReadLine();
4

2 に答える 2

1

例外を沈黙させるためのtrycatchはありません。Enterキーを2回押すとスローされます。このように振る舞うように作られていませんか?それをtry'ncatchで包むと、優雅になります。

                try
                {
                    for (int i = 0; i < int.MaxValue; i++)
                    {
                        if (token.IsCancellationRequested)
                        {
                            Console.WriteLine("Task cancel detected");
                            token.ThrowIfCancellationRequested();
                        }
                        else
                        {
                            Console.WriteLine("Int value {0}", i);
                        }
                    }
                }
                catch(OperationCanceledException e)
                {
                    Console.WriteLine("Task cancelled via token!");
                }

キャッチに使用できる便利なCancelletionToken.ThrowIfCancellationRequested()メソッドもあります。

于 2012-11-24T17:27:10.483 に答える
1

例外はTPLによってキャッチされ、タスクはキャンセル状態になります。したがって、例外が表示されている間(デバッガーで例外がオンになっている場合)、それは処理されます。

レオンが述べたように、CancellationToken.ThrowIfCancellationRequested自分でチェック+スローするのではなく、メソッドを使用する必要があります。

このページには、タスクのキャンセルに関する詳細が記載されています:http: //msdn.microsoft.com/en-us/library/dd997396.aspx

于 2012-11-26T14:25:22.700 に答える