2

假设我有这个代码:

  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 操作,所以它可能有内部方法(APM),BeginFOO/EndFOO 其中没有绑定线程。

当操作完成时,来自线程池的一个新的/相同的线程(通过完成端口)正在处理响应。

一切都好。

让我想知道的一件事是它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这里会阻塞线程吗?
4

1 回答 1

2

#1:

这里的重点WaitOne是允许人们编写等待完成的同步代码;如果您不需要使用诸如等之类的方法WaitOne请不要使用它们;没关系。WaitAny

#2:

这两种情况下,无论是使用专用线程,还是通过其他回调完成,是的,它阻塞了一个线程:它阻塞了通过调用请求阻塞的线程WaitOne。如果你不想这样:不要打电话WaitOne


另外:由于您指定 4.0,您可能会发现Task<T>使用TaskCompletionSource<T>. 编辑:我现在意识到,由于满足该IHttpAsyncHandler.BeginProcessRequest方法,这不是一个选项。

于 2014-04-15T13:54:29.257 回答