什么时候ManualResetEvent.Set()可以返回false?

时间:2010-11-03 23:58:20

标签: c# multithreading waithandle

根据MSDN文档,ManualResetEvent(或任何EventWaitHandle)上的Set()和Reset()返回一个布尔指示符,无论操作是否成功。

在哪种情况下,此调用可以返回false,如果有,我该怎么办?

2 个答案:

答案 0 :(得分:19)

我不知道如何回答这个问题并查看很多MSDN示例,忽略了Set返回值,因此它一定不重要或不太可能发生。

但这还不够好。我启动了我的VM,然后打开了Reflector来查看代码。 ManualResetEvent没有Set,但它继承自EventWaitHandle。这是代码:

public bool Set()
{
    bool flag = Win32Native.SetEvent(base.safeWaitHandle);
    if (!flag)
    {
        __Error.WinIOError();
    }
    return flag;
}

从Kernel32导入SetEvent:

[DllImport("kernel32.dll", SetLastError=true)]
internal static extern bool SetEvent(SafeWaitHandle handle);

WinIOError()调用只调用我们并不关心的GetLastWin32Error。基本上这意味着对于返回false的调用,在Win32本机代码中必须发生一些非常错误。

将这些信息与官方MSDN文档中托管的代码忽略返回值这一事实一致(为什么不呢?如果内核失败,你打算做什么?)如果你想清理你的话,你可以放心地自己忽略它如果你特别迂腐,可以稍微逻辑一下,或者记录下来。

答案 1 :(得分:0)

我不确定只会记录日志错误并继续执行。 Set()的错误结果可能会在等待处理程序管理的线程同步中带来错误的行为。那就是多线程...我对处理false Set()结果的看法 - 抛出异常,在大多数情况下可能是未处理的。