【问题标题】:Details of AsyncWaitHandle.WaitOneAsyncWaitHandle.WaitOne 的详细信息
【发布时间】:2009-11-29 17:17:01
【问题描述】:

1)调用AsyncWaitHandle.WaitOne可能会阻塞客户端还是一定会阻塞客户端?。

2)WaitAll、WaitOne、WaitAny有什么区别?

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:
    1. WaitHandle.WaitOne() 是一个实例方法,它将阻塞直到发出等待句柄信号(当操作完成时)。如果之前已经发出信号(即操作已经完成),则对 WaitOne() 的调用可能不会阻塞。
    2. WaitHandle.WaitAll()WaitHandle.WaitAny() 是静态方法,允许您指定要同时监视的等待句柄数:

      • WaitHandle.WaitAll() 将等到所有指定句柄都发出信号后才返回。
      • WaitHandle.WaitAny() 将在任何指定句柄发出信号后立即返回。

      这些方法允许您同时监控许多未完成的异步操作。

    背景: AsyncWaitHandleIAsyncResult 接口上的属性名称。该属性的实际类型为WaitHandle,是SemaphoreMutexManual/AutoResetEvent等类型的抽象基类。

    另请参阅: Blocking Application Execution Using an AsyncWaitHandle (MSDN)

    【讨论】:

    • 在 EndInvoke() 之前我们需要调用它们吗?
    • 你是对的,但我认为 OP 是专门询问 AsyncWaitHandle.WaitOne()。所以我想他是在问即使异步操作已经完成,对 WaitOne 的调用是否总是会阻塞,当然它不会
    • 没有。 EndInvoke() 可以在 BeginInvoke() 之后的任何时间调用,如果操作尚未完成,则会阻塞。
    • @threadpool.Calling EndInvoke 将阻塞直到异步操作完成,因此如果您不希望也不需要调用 WaitOne。但是,如果您确实调用了 WaitOne,您仍然需要调用 EndInvoke,特别是如果您的异步操作返回 val 等
    • 而且你应该总是调用 EndInvoke 否则你会泄漏资源(内部使用的等待句柄)。
    【解决方案2】:

    这些方法允许您等待 Windows 事件。 WaitOne 是非静态的,它等待该对象的事件句柄。 WaitAll 和 WaitAny 是静态类范围的方法,它们等待一组事件处理程序。 WaitAll 等待所有事件发出信号,WaitAny 等待组中的单个事件。

    【讨论】:

    • 不确定“等待 Windows 事件”是什么意思。 WaitOne 主要用于同步异步操作,即一个线程与另一个线程同步。 OP 在询问 AsyncWaitHandle.WaitOne。 AsyncWaitHandle 是通常用于同步 BeginInvoke 的 WaitHandle,即它无需在 IAsyncResult 上轮询和调用 IsCompleted
    • 它也可以用于windows事件(例如CreateEvent)见SafeWaitHandle属性和msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 2018-06-27
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多