WebRequest.BeginGetResponse不能异步工作

本文关键字:工作 异步 不能 BeginGetResponse WebRequest | 更新日期: 2023-09-27 18:09:06

我有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();
    }

}

WebRequest.BeginGetResponse不能异步工作

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

您正在等待您的ManualResetEvent在启动请求后。这就是线程阻塞的原因。在调用完成的回调之前,线程没有得到继续的信号。