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