假设我有这样的代码:
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对IO使用APM,如果没有waitHAndle阻塞/绑定线程,那么如何(用于什么)使用?问题2
MyAsynchOperation不使用APM,这只是我的实现,内部调用了new Thread().start(do some calculation),后来我称之为AsyncCallback's Callback -- waithandle在这里阻塞线程吗?发布于 2014-04-15 13:54:29
#1:
WaitOne的全部目的是允许人们编写等待完成的同步代码;如果您不需要使用WaitOne、WaitAny等方法,那么就不要使用它们;这很好。
#2:
在这两种情况下,无论是使用专用线程,还是通过其他回调完成,都会阻塞线程:它阻止请求通过调用WaitOne阻止的线程。如果你不想那样做,不要打电话给WaitOne。
旁白:由于您指定了4.0,您可能会发现使用Task<T>返回一个TaskCompletionSource<T>更为直观。编辑:我现在意识到,由于满足IHttpAsyncHandler.BeginProcessRequest方法,这不是一个选项。
https://stackoverflow.com/questions/23085600
复制相似问题