5

私はいつもこれについて考えてきました。

HttpWebRequestクラスを使用した単純な非同期Webリクエストがあるとしましょう

class webtest1
{
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("www.google.com");

    public webtest1()
    {
        this.StartWebRequest();
    }

    void StartWebRequest()
    {
        webRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), null);
    }

    void FinishWebRequest(IAsyncResult result)
    {
        webRequest.EndGetResponse(result);
    }
}

同じことは、同期操作で簡単に実現できます。

class webtest1
{
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("www.google.com");

    public webtest1()
    {
        webRequest.GetResponse();
    }
}

では、もっと単純な同期操作で十分なのに、なぜもっと複雑な非同期操作を使用したいのでしょうか。システムリソースを節約するには?

4

6 に答える 6

9

非同期リクエストを行う場合は、リクエストへの応答を待つ間に他のことを行うことができます。同期要求を行う場合は、他のことを実行できるようになるまで、応答を受信するまで待つ必要があります。

単純なプログラムやスクリプトの場合、それほど重要ではない場合があります。実際、これらの状況の多くでは、同期方式のコーディングと理解が容易な方が設計上の選択として適しています。

ただし、デスクトップアプリケーションなどの重要なプログラムの場合、要求が終了するまでアプリケーション全体をロックする同期要求は、許容できないユーザーエクスペリエンスを引き起こします。

于 2011-12-13T22:57:33.943 に答える
6

同期操作は、リクエストが完了するかタイムアウトするのを待っている間、他のことをすることを防ぎます。非同期操作を使用すると、ユーザーがプログラムがビジーであることを示すために何かをアニメーション化したり、他の機能領域での作業を継続したりすることができます。

于 2011-12-13T22:51:20.803 に答える
6

同期バージョンはコーディングが簡単ですが、非常に深刻な問題を覆い隠します。ネットワーク通信、または実際にはI / O操作は、長期間にわたってブロックされる可能性があります。たとえば、多くのネットワーク接続には2分のタイムアウトがあります。

ネットワーク操作を同期的に実行するということは、アプリケーションとUIがその操作の全期間にわたってブロックされることを意味します。珍しいことではありませんが、ネットワークの一時的な中断により、アプリが数分間ブロックされ、キャンセルできなくなる可能性があります。これは非常に不幸な顧客につながります。

于 2011-12-13T22:52:56.073 に答える
4

非同期は、コアよりも多くのことが行われている場合に特に役立ちます。たとえば、アクティブなWebリクエストが多数あり、ファイルアクセス操作が多数あり、DB呼び出しが少なく、その他のネットワーク操作(WCFまたはredis多分)。これらすべてが同期している場合は、多くのスレッド、多くのスタックを作成し、多くのコンテキストスイッチに悩まされています。非同期APIを使用できる場合は、通常、各操作が何かを実行している間、プールスレッドを利用できます。これは、高スループットのサーバー環境に最適です。複数のコアを持つことは素晴らしいことですが、効率的であることはより良いことです。

C#5では、これは、を介してawait、2番目の例よりも多くの作業になりません。

于 2011-12-13T22:55:36.923 に答える
2

私は先日これを読んでいましたが、以前にも同様の質問が考えられていました。

同期HTTPハンドラーと非同期HTTPハンドラーのパフォーマンスの違い

于 2011-12-13T22:52:21.380 に答える
1

1) Silverlightなどのシングルスレッド環境に固執しています。ここでは、非同期呼び出しを使用する以外に選択肢はありません。そうしないと、ユーザースレッド全体がロックされます。

2)処理に時間がかかる通話がたくさんあります。 スレッドが続行できるのにスレッド全体をブロックし、リターンを待っている間に他のことを行うのはなぜですか?たとえば、それぞれ5秒かかる5つの関数呼び出しがある場合、それらすべてをすぐに開始し、必要に応じて返すようにします。

3)出力で同期的に処理するにはデータが多すぎます。10ギガバイトのデータをコンソールに書き込むプログラムがあり、出力を読み取りたい場合は、非同期で行ごとに処理する機会があります。これを同期的に行うと、バッファスペースが不足し、プログラムがロックされます。

于 2011-12-13T22:52:11.100 に答える