Multithreading WebRequest.BeingGetResponse和IAsyncResult.AsyncWaitHandle不工作

Multithreading WebRequest.BeingGetResponse和IAsyncResult.AsyncWaitHandle不工作,multithreading,asynchronous,webrequest,Multithreading,Asynchronous,Webrequest,WebRequest.BeginGetResponse返回IAsyncResult,该结果具有成员AsyncWaitHandle。 起初,我认为我可以在启动代码中等待。但事实证明,只要发出请求,并且在调用EndGetResponse之前而不是之后,事件就会发出信号。这对我来说似乎不直观,但不管怎样 所以,我找了一些例子,似乎有两种方法。 一种方法是创建ManualResetEvent并将其作为用户状态传递,以便在回调中我可以在EndGetResponse之后设置它 另一种是使用ThreadPoo

WebRequest.BeginGetResponse返回IAsyncResult,该结果具有成员AsyncWaitHandle。 起初,我认为我可以在启动代码中等待。但事实证明,只要发出请求,并且在调用EndGetResponse之前而不是之后,事件就会发出信号。这对我来说似乎不直观,但不管怎样

所以,我找了一些例子,似乎有两种方法。 一种方法是创建ManualResetEvent并将其作为用户状态传递,以便在回调中我可以在EndGetResponse之后设置它

另一种是使用ThreadPool.RegisterWaitForSingleObject。比如:

ManualResetEvent waitHandle = new ManualResetEvent(false);

ThreadPool.RegisterWaitForSingleObject(asyncResult.AsyncWaitHandle,
    new WaitOrTimerCallback((s, t) => { waitHandle.Set(); }), null, -1, true);

waitHandle.WaitOne();
即使很丑也行。查看有关BeginGetResponse的MSDN文档,代码示例就是这样做的


我的问题是,将ManualResetEvent作为用户状态传递,对我来说似乎简单得多。此ThreadPool.RegisterWaitforSingleObject有什么好处?

您可以使用该WaitHandle等待该请求获得响应。当WaitHandle收到一个信号时,您知道响应已经到达,然后调用EndGetResponse以实际获得响应。

谢谢-但问题实际上是关于使用ThreadPool.RegisterWaitForSingleObject与simple ManualResetEvent来等待异步操作完成。我只是对此做出了反应:但事实证明,一旦发出请求,事件就会在请求之前而不是之后发出信号调用EndGetResponse。这对我来说似乎不太直观,但不管怎样。我希望微软的人能解释为什么在回复准备好之前发出IAsyncResult.ASyncWaitHandle的信号。…。@ThomasS.Trias:这条评论是否与问题相关,特别是因为问题已经超过2年了。你的评论听起来更像是一个缺乏相关背景信息的问题。