SLaks が言ったように、あなたのコードは正常に動作します。
例を単純化しすぎてasync void
、コードに が含まれている可能性が高いと思います。
以下は正常に動作します:
private static void Main(string[] args)
{
CallAsync();
Console.Read();
}
public static async void CallAsync()
{
try
{
await DoSomething();
}
catch (Exception)
{
// Handle exceptions ?
Console.WriteLine("In the catch");
}
}
public static Task DoSomething()
{
return Task.Run(() =>
{
throw new Exception();
});
}
以下は機能しません:
private static void Main(string[] args)
{
CallAsync();
Console.Read();
}
public static void CallAsync()
{
try
{
DoSomething();
}
catch (Exception)
{
// Handle exceptions ?
Console.WriteLine("In the catch");
}
}
public static async void DoSomething()
{
await Task.Run(() =>
{
throw new Exception();
});
}
http://msdn.microsoft.com/en-us/magazine/jj991977.aspxを参照してください。
Async void メソッドには、異なるエラー処理セマンティクスがあります。async Task または async Task メソッドから例外がスローされると、その例外がキャプチャされ、Task オブジェクトに配置されます。async void メソッドには Task オブジェクトがないため、async void メソッドからスローされた例外は、async void メソッドの開始時にアクティブだった SynchronizationContext で直接発生します。図 2 は、async void メソッドからスローされた例外を自然にキャッチできないことを示しています。