次のように、(スタック トレースを含む) 例外を再度スローする前async
に、ブロック内のメソッドを呼び出す必要があります。catch
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
ただし、残念ながらorブロックawait
では使用できません。コンパイラには、ブロックに戻って命令の後にあるものなどを実行する方法がないためだとわかりました...catch
finally
catch
await
Task.Wait()
交換しようとしawait
たら行き詰まりました。これを回避する方法を Web で検索したところ、このサイトを見つけました。
メソッドを変更することも、async
メソッドが を使用しているかどうかもわからないため、(デッドロックを回避するために) 別のスレッドにいるときに async メソッドを開始し、その完了を待機するConfigureAwait(false)
メソッドを作成しました。Func<Task>
public static void AwaitTaskSync(Func<Task> action)
{
Task.Run(async () => await action().ConfigureAwait(false)).Wait();
}
public static TResult AwaitTaskSync<TResult>(Func<Task<TResult>> action)
{
return Task.Run(async () => await action().ConfigureAwait(false)).Result;
}
public static void AwaitSync(Func<IAsyncAction> action)
{
AwaitTaskSync(() => action().AsTask());
}
public static TResult AwaitSync<TResult>(Func<IAsyncOperation<TResult>> action)
{
return AwaitTaskSync(() => action().AsTask());
}
私の質問は次のとおりです。このコードは大丈夫だと思いますか?
もちろん、機能強化があれば、またはより良いアプローチを知っている場合は、聞いています! :)