gpt4 book ai didi

c# - IAsyncResult 的 WaitHandle 和阻塞?

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:46 24 4
gpt4 key购买 nike

假设我有这段代码:

  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如果没有没有阻塞/绑定(bind)线程,正在使用?

问题#2

  • 假设MyAsynchOperation 没有使用 APM,它只是我在内部调用 new Thread().start(do some calculation) 的实现我后来称之为 AsyncCallback's Callback ---- 做 waithandle这里阻塞了一个线程?

最佳答案

#1:

这里 WaitOne 的全部意义在于允许人们编写等待完成的同步代码;如果您不需要使用 WaitOneWaitAny 等方法 - 那么不要使用它们;没关系。

#2:

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


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

关于c# - IAsyncResult 的 WaitHandle 和阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23085600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com