[解決済み] try/catch/finallyでawaitの良い解決策?
2023-02-05 18:10:21
質問
私は
async
メソッドを呼び出す必要があります。
catch
ブロックを作成し、例外(スタックトレース付き)を再度投げるようにします。
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
しかし、残念ながら
await
の中で
catch
または
finally
というブロックがあります。これは、コンパイラが
catch
ブロックの後にあるものを実行するために
await
の後にあるものを実行します。
を使おうとしたのですが
Task.Wait()
を置換するために
await
を実行すると、デッドロックが発生しました。これを回避する方法をWebで検索したところ、次のようなものが見つかりました。
このサイト
.
を変更することができないので
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());
}
そこで質問です。このコードで大丈夫だと思いますか?
もちろん、あなたが何か改良したり、より良い方法を知っているならば、私は聞いています! :)
どのように解決するのですか?
の外側にロジックを移動させることができます。
catch
ブロックの外にロジックを移動し、必要であれば例外を再スローすることができます。
ExceptionDispatchInfo
.
static async Task f()
{
ExceptionDispatchInfo capturedException = null;
try
{
await TaskThatFails();
}
catch (MyException ex)
{
capturedException = ExceptionDispatchInfo.Capture(ex);
}
if (capturedException != null)
{
await ExceptionHandler();
capturedException.Throw();
}
}
こうすることで、呼び出し側が例外の
StackTrace
プロパティを検査するとき、それはまだ
TaskThatFails
内のどこで投げられたかを記録します。
関連
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] 複数のタスクにasync/awaitを使用する
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
-
[解決済み】try {...} finally {...} は良くて、try {...} catch{} はダメなのはなぜ?
-
[解決済み】try { return x; } finally { x = null; }文の中で実際に何が起こっているのか?
-
[解決済み】Pythonでtry-except-elseを使用するのは良い習慣ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】プロセスが実行されているかどうかを知るには?