メソッドが開始されるasync
と、現在の同期コンテキストがキャプチャされます。この問題を解決する方法は、例外をキャプチャする独自の同期コンテキストを作成することです。
ここでのポイントは、同期コンテキストがコールバックをスレッドプールにポストすることですが、その周りにtry/catchがあります。
public class AsyncSynchronizationContext : SynchronizationContext
{
public override void Send(SendOrPostCallback d, object state)
{
try
{
d(state);
}
catch (Exception ex)
{
// Put your exception handling logic here.
Console.WriteLine(ex.Message);
}
}
public override void Post(SendOrPostCallback d, object state)
{
try
{
d(state);
}
catch (Exception ex)
{
// Put your exception handling logic here.
Console.WriteLine(ex.Message);
}
}
}
上記ではcatch
、例外処理ロジックを配置できます。
次に、このメカニズムでメソッドを実行するすべてのスレッド(SynchronizationContext.Current
is )で、現在の同期コンテキストを設定する必要があります。[ThreadStatic]
async
SynchronizationContext.SetSynchronizationContext(new AsyncSynchronizationContext());
完全なMain
例:
class Program
{
static void Main(string[] args)
{
SynchronizationContext.SetSynchronizationContext(new AsyncSynchronizationContext());
ExecuteAsyncMethod();
Console.ReadKey();
}
private static async void ExecuteAsyncMethod()
{
await AsyncMethod();
}
private static async Task AsyncMethod()
{
throw new Exception("Exception from async");
}
}