1

非同期呼び出しを行うためのこのコードがありますが、そうではありません。それを見て、どこが間違っているのか教えてください。

try
{
    byte[] bytes;
    Stream objRequestStream = null;
    bytes = System.Text.Encoding.ASCII.GetBytes(GetJSONforGetMenuDetails(Id, MenuIds));
    wReq = (HttpWebRequest)WebRequest.Create(new Uri("http://" + MobileWLCUrl + urlCreateCacheAPI));
    wReq.ContentLength = bytes.Length;
    wReq.ContentType = "text/x-json";
    wReq.ServicePoint.Expect100Continue = false;
    wReq.Method = "POST";
    objRequestStream = wReq.GetRequestStream();
    objRequestStream.Write(bytes, 0, bytes.Length);
    objRequestStream.Close();
    wReq.BeginGetResponse(new AsyncCallback(FinishWebRequest), null);
    //resp = WebAccess.GetWebClient().UploadString("http://" + MobileWLCUrl + urlCreateCacheAPI, GetJSONforGetMenuDetails(Id, MenuIds));
    //EngineException.CreateLog("Cache Created (for Menus: " + MenuIds + ") in API for LocationId: " + Id);
}
catch (Exception ex) { EngineException.HandleException(ex); }

void FinishWebRequest(IAsyncResult result)
{
    WebResponse wResp = wReq.EndGetResponse(result) as WebResponse;
    StreamReader sr = new StreamReader(wResp.GetResponseStream());
    String res = sr.ReadToEnd();
    EngineException.CreateLog("Cache Created (for Menus: " + MenuIds + ") in API for LocationId: " + LocId);
}

どこが悪いのでしょうか?デバッグすると、呼び出しが続行するのを待ちますが、それは発生しないはずです。

4

1 に答える 1

0

BeginGetResponse同期部分を含むように文書化されています:

BeginGetResponse メソッドでは、このメソッドが非同期になる前に、いくつかの同期セットアップ タスク (DNS 解決、プロキシ検出、TCP ソケット接続など) を完了する必要があります。結果として、このメソッドはユーザー インターフェイス (UI) スレッドで呼び出されるべきではありません。これは、通常は数秒かかる場合があるためです。Webproxy スクリプトが正しく構成されていない一部の環境では、これに 60 秒以上かかる場合があります。

それとは別に、リクエストが完了する前にFinishWebRequest(技術的には を呼び出すとEndGetResponse)を呼び出すと、ブロックされます。EndGetResponse

は応答データを取得できるオブジェクトを返す必要EndGetResponseがあるため、これは想定内ですが、要求がまだ完了していない場合、どのようにしてそのようなオブジェクトを返すことができるのでしょうか?

于 2012-05-21T10:46:17.003 に答える