1. ホーム
  2. c#

[解決済み] C#でawaitを使わずに非同期メソッドを安全に呼び出す方法

2022-03-25 10:29:41

質問

私は 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) を意味します。