【发布时间】:2013-02-25 23:25:50
【问题描述】:
我有以下代码,其目标是等待所有给定的等待句柄,但可以通过特定的等待句柄取消:
public static bool CancelableWaitAll(WaitHandle[] waitHandles, WaitHandle cancelWaitHandle)
{
var waitHandleList = new List<WaitHandle>();
waitHandleList.Add(cancelWaitHandle);
waitHandleList.AddRange(waitHandles);
int handleIdx;
do
{
handleIdx = WaitHandle.WaitAny(waitHandleList.ToArray());
waitHandleList.RemoveAt(handleIdx);
}
while (waitHandleList.Count > 1 && handleIdx != 0);
return handleIdx != 0;
}
这仅适用于 ManualReset 事件。使用 AutoReset 事件时,WaitAny 会重置所有信号事件,但仅返回第一个信号事件(根据 MSDN)。
任何想法如何在不轮询的情况下以适当的方式使用 AutoReset 事件完成此操作?
【问题讨论】:
-
尝试使用其中一种重载方法。并尝试在进入do-while之前创建数组,也许你会有新的见解。
-
如果引发取消事件,我无法理解这将如何工作?
-
如果引发取消事件,则取消对所有给定 waitHandles 的等待
-
@Luke,这是因为取消句柄位于索引 0 处,而 while() 确保信号事件不在索引 0 处(handleIdx != 0)
-
@MatthewWatson 我现在明白了,干杯:)
标签: c# waithandle