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();
}
}
BeginGetResponse同步等待连接,然后异步接收数据。如果连接需要一些时间,它将冻结调用线程一段时间。
您正在等待您的ManualResetEvent在启动请求后。这就是线程阻塞的原因。在调用完成的回调之前,线程没有得到继续的信号。