制限付きウェイトハンドルに自動測定されたオブジェクトをラップしますか?
-
26-10-2019 - |
質問
私はそれを行うためにスレッドを起動するライブラリを構築し、ウェイトハンドルを発信者に返します。
バグレポートを見ると、私のライブラリに電話をかけているコードが返されたオブジェクトを取得し、それを自動測定値(それがそうです)にキャストし、フラグ自体を上げていると思われます。それをするつもりはありません。
自動測定されたオブジェクトを、まだ待機して待機することができるが、コードによってのみ上げられることができるもので包む方法はありますか?
ありがとう。
解決
派生した新しいクラスを作成できます EventWaitHandle
そしてオーバーライド Set
と Reset
したがって、彼らは何もしないか、例外を投げます。実際、作成する必要があります new
以来、実装 Set
と Reset
仮想ではありません。もちろん、独自の他の名前の方法を作成する必要があります。お気に入り MyInternalSet
と MyInternalReset
. 。可能ですが、私はそれをすることをお勧めしません。
代わりに、クライアントがイベントを設定またはリセットしてはならないことを文書化します。なぜなら、そうすることで予測不可能な動作を引き起こすからです。
aを作成できます WaitHandle
- あなたを保持する派生したクラス AutoResetEvent
として internal
財産。クライアントコードはそれにアクセスできません。何かのようなもの:
public class MyWaitHandle: WaitHandle
{
internal AutoResetEvent InternalEvent { get; private set; }
internal MyWaitHandle(AutoResetEvent event)
{
InternalEvent = event;
}
public override bool WaitOne(int32 timeout)
{
return InternalEvent.WaitOne();
}
}
保護されたものをオーバーライドする必要があります Dispose(Boolean)
メソッド、それが内部ハンドルを処分するように、そしてあなたは他のハンドルが必要です WaitOne
オーバーロードも同様です。その後、作成できます internal
の実装 Set
と Reset
, 、またはコードを呼び出すだけです InternalHandle.Set
.
私はまだ、最善の行動方針は、クライアントにそうしないように指示することだと思います。しかし、あなたがそれを防ぐ必要があるなら、上記は機能するはずです。