53

簡単な質問です。戻り値なしで非同期タスクを起動する前に、少し待ちたいと思います。 これは正しい方法ですか?

Task.Delay(1000)
    .ContinueWith(t => _mq.Send(message))
    .Start();

例外はどうなりますか?

4

3 に答える 3

13

タスクが終了するまで待機すると、タスクでスローされた例外をキャッチできます。

タスクでスローされた例外が内部のものになることに注意してください

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Task task = Task.Delay(1000)
                .ContinueWith(t => Program.throwsException());

            task.Wait();     
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception:" + ex.Message); // Outputs: Exception:One or more errors occurred.
            Console.WriteLine("Inner exception:" + ex.InnerException.Message); // Outputs: Exception:thrown
        }
        Console.ReadKey();

    }
    static void throwsException()
    {
        Console.WriteLine("Method started");
        throw new Exception("thrown");
    }
}
于 2013-10-31T10:25:42.980 に答える
0

タスクを実行している場合は、例外を観察できWaitます。

タスク内で実行されているユーザー コードによってスローされた未処理の例外は、このトピックで後述する特定のシナリオを除き、参加しているスレッドに反映されます。静的またはインスタンスの Task.Wait または Task.Wait メソッドのいずれかを使用すると、例外が伝達され、try-catch ステートメントで呼び出しを囲むことによってそれらを処理します。

例外処理(タスク並列ライブラリ)より抜粋

タイミングに注意してください。タスクはスケジューラを使用しており、あなたが「行く」と言ったときに開始されるとは限りません。あなたのコードは、それを伝えた後、少なくとも1000 ミリ秒の遅延を保証しますが、正確Startに 1000 ミリ秒になることは保証されていません。

于 2013-10-31T10:23:53.750 に答える