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'sCallback——waithandle会阻塞线程吗

IAsyncResult's WaitHandle and blocking?

#1:

这里WaitOne的全部目的是允许人们编写等待完成的同步代码;如果您不需要使用WaitOneWaitAny等方法,则不要使用它们;没关系。

#2:

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


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