簡単な質問です。戻り値なしで非同期タスクを起動する前に、少し待ちたいと思います。
これは正しい方法ですか?
Task.Delay(1000)
.ContinueWith(t => _mq.Send(message))
.Start();
例外はどうなりますか?
簡単な質問です。戻り値なしで非同期タスクを起動する前に、少し待ちたいと思います。
これは正しい方法ですか?
Task.Delay(1000)
.ContinueWith(t => _mq.Send(message))
.Start();
例外はどうなりますか?
タスクが終了するまで待機すると、タスクでスローされた例外をキャッチできます。
タスクでスローされた例外が内部のものになることに注意してください
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");
}
}
タスクを実行している場合は、例外を観察できWait
ます。
タスク内で実行されているユーザー コードによってスローされた未処理の例外は、このトピックで後述する特定のシナリオを除き、参加しているスレッドに反映されます。静的またはインスタンスの Task.Wait または Task.Wait メソッドのいずれかを使用すると、例外が伝達され、try-catch ステートメントで呼び出しを囲むことによってそれらを処理します。
例外処理(タスク並列ライブラリ)より抜粋
タイミングに注意してください。タスクはスケジューラを使用しており、あなたが「行く」と言ったときに開始されるとは限りません。あなたのコードは、それを伝えた後、少なくとも1000 ミリ秒の遅延を保証しますが、正確Start
に 1000 ミリ秒になることは保証されていません。