IAsyncResult's WaitHandle and blocking?
本文关键字:and blocking WaitHandle IAsyncResult | 更新日期: 2023-09-27 17:58:37
假设我有这样的代码:
public class MyAsyncHandler : IHttpAsyncHandler
{
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
{
MyAsynchOperation asynch = new MyAsynchOperation(cb, context, extraData);
asynch.StartAsyncWork();
return asynch;
}
//...
现在,如果MyAsynchOperation
是一个IO操作,那么它可能有BeginFOO/EndFOO
的内部方法(APM),这些方法不绑定线程
当操作完成时,来自线程池的一个新的/相同的线程(通过完成端口)正在处理响应。
一切正常。
但是让我怀疑的一件事是IAsyncResult
具有以下属性:
System.Threading.WaitHandle AsyncWaitHandle { get; }
我熟悉WaitHadnle
,它有一个阻止当前线程的方法
线程通过调用WaitOne
在旋转栅门处等待或阻塞(例如)。
我的问题是:
问题#1
- 假设
MyAsynchOperation
使用APM进行IO,如果没有阻塞/绑定线程,waitHAndle
是如何使用的
问题#2
- 假设
MyAsynchOperation
不是使用APM的,并且它只是我的实现,它在内部调用new Thread().start(do some calculation)
,稍后我将其称为AsyncCallback's
Callback
——waithandle
会阻塞线程吗
#1:
这里WaitOne
的全部目的是允许人们编写等待完成的同步代码;如果您不需要使用WaitOne
、WaitAny
等方法,则不要使用它们;没关系。
#2:
在这两种情况下,无论它使用专用线程,还是通过其他回调完成,都会阻塞线程:它通过调用WaitOne
来阻塞请求阻塞的线程。如果你不想这样:不要打WaitOne
。
另外:由于您指定了4.0,您可能会发现使用TaskCompletionSource<T>
返回Task<T>
更直观。编辑:我现在意识到,由于满足IHttpAsyncHandler.BeginProcessRequest
方法,这不是一个选项。