WebRequest.BeginGetResponse не работает асинхронно - PullRequest
1 голос
/ 21 сентября 2011

У меня есть код C # и у меня проблема с webRequest.begingetresponse .

Когда я пытаюсь использовать его для асинхронного вызова , рабочий поток блокируется и ожидает вызова обратного вызова. Но, как я прочитал в документации, текущий поток должен продолжать работать, а метод обратного вызова должен вызываться другим потоком, как только ответ возвращается с сервера.

[ UPDATE ] На самом деле получение ответа от сервера - это когда текущий поток блокируется, и когда я проверяю идентификаторы потока, поток, который вызывает обратный вызов, является тем же потоком, который отправил запрос. .

Есть идеи, чего мне не хватает?

Вот фрагмент кода:

public class MyRequestState
{

    public WebRequest Request;
    public WebResponse Response;
    public ManualResetEvent allDone = new ManualResetEvent(false);

    public MyRequestState()
    {

        Request = null;
        Response = null;
    }
}


public class SendRequest
{
    private void ResponseCallback(IAsyncResult result)
    { 
     //do sth ... 
     state.Response = (HttpWebResponse)request.EndGetResponse(result);
     //do sth ...
     state.allDone.Set();
    }
    public void MakeWebRequestAsync(string url)
    {
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
     request.Method = "GET";
     request.Proxy = null;
     state state = new MyRequestState();
     state.Request = request;

     IAsyncResult result = request.BeginGetResponse(new    System.AsyncCallback(ResponseCallback), state);

     state.allDone.WaitOne();
    }

}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2011

Вы ожидаете события ManualResetEvent сразу после запуска запроса. Вот почему ваш поток блокируется. Поток не получает сигнал о продолжении, пока не будет вызван ваш завершенный обратный вызов.

0 голосов
/ 21 сентября 2011

WebRequest.BeginGetResponse ожидает подключения синхронно, а затем получает данные асинхронно. Если соединение занимает несколько раз, оно на некоторое время останавливает вызывающий поток.

...