WebRequest.BeginGetResponse不能异步工作

时间:2011-09-21 05:57:14

标签: c# asynchronous callback httpwebrequest webrequest

我有C#代码并且遇到 webRequest.begingetresponse 的问题。

当我尝试将其用于异步调用时,工作线程被阻塞并等待调用回调。但是,正如我在文档中读到的那样,当前线程应该继续运行,并且一旦响应从服务器返回,则应该由不同的线程调用回调方法。

[ UPDATE ]实际上从服务器获取响应是当前线程被阻止的位置,当我检查线程ID时,调用回调的线程是发送回调的线程请求。

知道我可能缺少什么吗?

以下是代码片段:

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 :(得分:0)

WebRequest.BeginGetResponse同步等待连接,然后异步接收数据。如果连接需要一些时间,它会冻结调用线程一段时间。

答案 1 :(得分:0)

您在启动请求后正在等待您的ManualResetEvent。这就是你的线程阻塞的原因。在调用完成的回调之前,线程不会继续发出信号。