首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WaitHandle和阻塞?

WaitHandle和阻塞?
EN

Stack Overflow用户
提问于 2014-04-15 13:45:20
回答 1查看 558关注 0票数 2

假设我有这样的代码:

代码语言:javascript
复制
  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在这里阻塞线程吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-15 13:54:29

#1:

WaitOne的全部目的是允许人们编写等待完成的同步代码;如果您不需要使用WaitOneWaitAny等方法,那么就不要使用它们;这很好。

#2:

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23085600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档