3

https経由で非同期get-requestを実装したい。これは、UIとリクエストスレッドを分離するために必要です。このコードは検索で機能しますが、本当に非同期かどうかはわかりません。このコードのパフォーマンス批評家を提供してください。

public void authHttp()
    {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("uri");
        request.BeginGetResponse(new AsyncCallback(ReadWebRequestCallback), request);
    }

    private void ReadWebRequestCallback(IAsyncResult callbackResult)
    {
        HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState;
        HttpWebResponse myResponse = (HttpWebResponse)myRequest.EndGetResponse(callbackResult);

        using (StreamReader httpwebStreamReader = new StreamReader(myResponse.GetResponseStream()))
        {
            string results = httpwebStreamReader.ReadToEnd();
            //TextBlockResults.Text = results; //-- on another thread!
            //Dispatcher.BeginInvoke(() => TextBlockResults.Text = results);
        }
        myResponse.Close();
    }
4

2 に答える 2

2

はい、非同期で実行されます。デバッグし、ReadWebRequestCallbackメソッドにブレークポイントを設定し、authHttpメソッドでBeginGetResponse呼び出しをステップオーバー(F10)することで確認できます。これを行うと、ブレークポイントがヒットしていないことに気付くでしょう。後でヒットします。

于 2012-08-10T19:39:17.937 に答える
2

BeginGetResponse(私はそれがUIスレッドで呼び出されると仮定しています)非同期です。ReadWebRequestCallbackUIスレッドとは異なるスレッド を呼び出します。BeginGetResponse非同期UIを使用するため、IO作業を行うために「スレッド」を使用しない場合があります。これはハードウェアにオフロードされる可能性があります。ただし、別のスレッドプールスレッドを使用してコールバックを呼び出します。

コールバックで非同期操作を続行することもお勧めします。 ReadToEnd同期です。セッションに使用される非同期IOサブシステムのスレッドをブロックしている限り、ブロックを解除してコールバックから戻るまで、他の非同期IOの実行がブロックされる可能性があります。.NET 4.5を使用している場合は、を参照してStreamReader.ReadtoEndAsyncください。そうでない場合は、ドロップダウンを使用してStream.BeginRead、すべてのデータが受信されるまでループする必要があります。

于 2012-08-10T21:40:56.213 に答える