web-dev-qa-db-ja.com

.NETCoreとの非同期リクエスト

問題を見つけるために少し助けが必要です。私はASP.NETコアを使用しており、それについてはかなりよく知っていますが、.NETコアC#は、非同期要求を行おうとすると「クラッシュ」して終了するようです。

システムの外部IPを返すメソッドがあります

private async Task<string> getExternalIP()
    {
        using (System.Net.Http.HttpClient HC = new System.Net.Http.HttpClient())
        {
            return await HC.GetStringAsync("https://api.ipify.org/");
        }

    }

これは機能するはずですが、HC.GetStringAsyncに到達すると終了します。また、ブレークポイントを設定しようとしましたが、実際には実行されません。

を使用してメソッドを呼び出そうとしています

string Address = await getExternalIP();

どんな助けもありがたいです、うまくいけば私は何かを見落としているだけではありません。

ありがとう!

6
Sasha

あなたの提案した解決策はまったく良くありません。

  1. 同期しています
  2. デッドロックを引き起こす可能性があります

別の方法として、次のアプローチを試してください。

private async Task<string> GetExternalIP()
{
    using (HttpClient client = new HttpClient())
        return await client.GetStringAsync("https://api.ipify.org/");
}

呼び出しメソッドも非同期である必要があります。

public async Task CallingMethod()
{
     // ...
     string address = await GetExternalIP();
     // ...
}

以前は機能しなかった理由は、async voidの代わりにasync Taskを使用したことが原因でした(コメントから推測されます)。

async voidは、待ちきれない非同期メソッドです。つまり、あなたはそれを呼び出すだけでそれを忘れることを意味します。例外は発生せず、戻り値も取得されません。

async Taskは、何も返さない待機可能な非同期メソッドです。これは、void同期メソッドの非同期対応物です。さらに、待機可能であるため、非同期コードで発生する可能性のある例外をキャッチすることもできます。

10
Matias Cicero