[解決済み] C#でawaitを使わずに非同期メソッドを安全に呼び出す方法
質問
私は
async
メソッドは何もデータを返しません。
public async Task MyAsyncMethod()
{
// do some stuff async, don't return any data
}
あるデータを返す別のメソッドからこれを呼び出しています。
public string GetStringData()
{
MyAsyncMethod(); // this generates a warning and swallows exceptions
return "hello world";
}
呼び出し
MyAsyncMethod()
を待たずに、"
この呼び出しは待機されないので、呼び出しが完了する前に現在のメソッドが実行され続ける
Visual Studioで警告が表示されます。その警告のページにはこう書かれています。
非同期呼び出しが完了するのを待つ必要がないことが確認された場合のみ、警告の抑制を検討する必要があります。 呼び出されたメソッドが例外を発生させないこと .
通話が完了するのを待つ必要はないし、待つ時間もないと思うのですが。 しかし、通話は かもしれない は例外を発生させます。
この問題には何度かつまずきましたが、きっと共通の解決策があるに違いない、よくある問題だと思います。
結果を待たずに非同期メソッドを安全に呼び出すにはどうすればよいですか?
更新してください。
結果を待つだけでいいという意見に対して、これは私たちのWebサービス(ASP.NET Web API)のWebリクエストに応答しているコードです。UIコンテキストでの待ち受けはUIスレッドを解放しておきますが、Webリクエストの呼び出しでの待ち受けは、リクエストに応答する前にタスクが終了するのを待ち、それによって無意味に応答時間を増加させます。
解決方法は?
例外を非同期で取得したい場合は、以下のようにします。
MyAsyncMethod().
ContinueWith(t => Console.WriteLine(t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
これにより、"main"スレッド以外のスレッドで例外を処理することができるようになります。 つまり、quot;main" への呼び出しを待つ必要がないのです。
MyAsyncMethod()
を呼び出したスレッドから
MyAsyncMethod
しかし、それでも、例外が発生した場合にのみ、例外で何かをすることができます。
更新してください。
技術的には、同じようなことを
await
:
try
{
await MyAsyncMethod().ConfigureAwait(false);
}
catch (Exception ex)
{
Trace.WriteLine(ex);
}
...これは、特に必要な場合に便利です。
try
/
catch
(または
using
を使用することができますが、私は
ContinueWith
を知る必要があるため、もう少し明示的にする必要があります。
ConfigureAwait(false)
を意味します。
関連
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] C#で同期メソッドから非同期メソッドを呼び出すには?
-
[解決済み] 非同期Task<T>メソッドを同期的に実行するにはどうしたらいいですか?
-
[解決済み] 複数のタスクにasync/awaitを使用する
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み] 警告 CS4014」を抑制する。この呼び出しは待機されていないため、現在のメソッドの実行は続行されます... "
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み] 関数を終了するには?
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み] 警告 CS4014」を抑制する。この呼び出しは待機されていないため、現在のメソッドの実行は続行されます... "