ManicalReseTevent.set()がfalseを返すのはいつですか?
-
28-09-2019 - |
質問
MSDNドキュメントによれば、ManualReseTevent(または任意のeventWaithandle)のset()とreset()は、操作が成功したかどうかにかかわらずブールインジケーターを返します。
この呼び出しはどのような状況でfalseを返すことができますか?
解決
これに答える方法がわかりませんでしたが、多くのMSDNの例を見ると、設定された返品値が無視されているため、重要または起こりそうにないはずです。
しかし、それで十分ではありませんでした。私はVMを起動し、コードを見てリフレクターを開きました。 ManicalReseteventには設定されていませんが、それは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()からの誤った結果は、待機ハンドラーによって管理されるスレッドの同期に誤った動作をもたらす可能性があります。それはマルチスレッドです... false set()結果を処理するという私のビジョン - 例外をスローします。おそらくほとんどの場合、これは扱いにくいことがあります。