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

Sof*_*mes 8 c# multithreading waithandle

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

在什么情况下这个调用可以返回false,如果有的话我应该怎么做?

Eri*_*ren 19

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

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

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

从Kernel32导入SetEvent的位置:

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

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

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

  • 研究得很好.+1 (2认同)