次のように例外を(スタックトレースとともに)再度スローする前async
に、catch
ブロック内のメソッドを呼び出す必要があります。
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
ただし、残念ながらawait
、catch
またはfinally
ブロックでは使用できません。それは、コンパイラーがcatch
ブロック内に戻ってawait
命令の後にあるものを実行する方法がないためだと学びました...
を使用Task.Wait()
して交換しようとしたawait
ところ、デッドロックが発生しました。これを回避する方法をウェブで検索して、このサイトを見つけました。
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());
}
だから私の質問は:このコードは大丈夫だと思いますか?
もちろん、いくつかの拡張機能がある場合、またはより良いアプローチを知っている場合は、私が聞いています!:)
await
C#6.0以降、Catchブロックでの使用が実際に許可されています(以下の私の回答を参照)