0

こんにちは、次のコードがあります。

    try
    {
        var t1 = Task.Factory.StartNew(() =>
        {
            Count(5, 10);
        });
        //t1.Wait(); //This line if uncommented causes the exception to be handled below....
        Console.WriteLine("done");
    }
    catch (AggregateException ex)
    {
        Console.WriteLine(ex);
    }

    private void Count(int start, int end)
    {
        for (var i = start; i <= end; i++)
        {
            Console.WriteLine(i);
            if (i == 7) throw new InvalidOperationException("Something bad happened");
            Thread.Sleep(1000);
        }
    }

タスクを待機したくないが例外を処理したい場合、どうすればこれを達成できますか?

4

2 に答える 2

6

タスクが失敗したときにエラーを処理する継続を作成します。

var t1 = Task.Factory.StartNew(() =>
    {
        Count(5, 10);
    });
t1.ContinueWith(
    (task) =>
    {
        var error = task.Exception;
        // handle error
    }, TaskContinuationOptions.OnlyOnFaulted);

OnlyOnFaultedタスクが失敗した場合に継続がスレッドプールスレッドで実行されることを指定します。タスクが正常に完了すると、実行されません。

于 2012-08-10T14:57:00.947 に答える
0

タスクを作成して開始したスタックはもう存在しない可能性があります...どのように例外を処理することが期待できますか?

あなたは出来る:

  1. 各タスクのスタックの一番上に例外処理を配置します。
  2. 子タスクの例外を作成/開始/待機/処理するタスクを作成する
  3. 例外を処理する継続タスクを作成します(Sean Uの回答のように)。
于 2012-08-10T15:00:38.103 に答える