根据 MSDN 文档,无论操作是否成功,ManualResetEvent(或任何 EventWaitHandle)上的 Set() 和 Reset() 都会返回一个布尔指示符。
在什么情况下这个调用会返回 false,如果是,我应该怎么做?
根据 MSDN 文档,无论操作是否成功,ManualResetEvent(或任何 EventWaitHandle)上的 Set() 和 Reset() 都会返回一个布尔指示符。
在什么情况下这个调用会返回 false,如果是,我应该怎么做?
我不确定如何回答这个问题,并且查看了很多 MSDN 示例,Set 返回值被忽略,因此它一定不重要或可能发生。
但这还不够好。我启动了我的虚拟机并打开了 Reflector 来查看代码。ManualResetEvent 没有 Set 但它继承自 EventWaitHandle 。这是代码:
public bool Set()
{
bool flag = Win32Native.SetEvent(base.safeWaitHandle);
if (!flag)
{
__Error.WinIOError();
}
return flag;
}
其中 SetEvent 是从 Kernel32 导入的:
[DllImport("kernel32.dll", SetLastError=true)]
internal static extern bool SetEvent(SafeWaitHandle handle);
WinIOError() 调用只是调用我们并不真正关心的 GetLastWin32Error。基本上,这意味着调用返回 false,Win32 本机代码中必须发生一些非常错误的事情。
将这些信息与托管在官方 MSDN 文档中的代码忽略返回值这一事实放在一起(为什么不呢?如果内核仍然失败,你会怎么做?)如果你想清理你的逻辑,你可以放心地自己忽略它如果您特别迂腐,请点或获取并记录它。
我不确定只记录错误并继续执行就足够了。Set() 的错误结果可能会在等待处理程序管理的线程同步中带来错误的行为。那是多线程......我对处理错误 Set() 结果的看法 - 抛出异常,在大多数情况下可能无法处理。