制限付きウェイトハンドルに自動測定されたオブジェクトをラップしますか?

StackOverflow https://stackoverflow.com/questions/6312875

質問

私はそれを行うためにスレッドを起動するライブラリを構築し、ウェイトハンドルを発信者に返します。

バグレポートを見ると、私のライブラリに電話をかけているコードが返されたオブジェクトを取得し、それを自動測定値(それがそうです)にキャストし、フラグ自体を上げていると思われます。それをするつもりはありません。

自動測定されたオブジェクトを、まだ待機して待機することができるが、コードによってのみ上げられることができるもので包む方法はありますか?

ありがとう。

役に立ちましたか?

解決

派生した新しいクラスを作成できます EventWaitHandle そしてオーバーライド SetReset したがって、彼らは何もしないか、例外を投げます。実際、作成する必要があります new 以来、実装 SetReset 仮想ではありません。もちろん、独自の他の名前の方法を作成する必要があります。お気に入り MyInternalSetMyInternalReset. 。可能ですが、私はそれをすることをお勧めしません。

代わりに、クライアントがイベントを設定またはリセットしてはならないことを文書化します。なぜなら、そうすることで予測不可能な動作を引き起こすからです。

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 の実装 SetReset, 、またはコードを呼び出すだけです InternalHandle.Set.

私はまだ、最善の行動方針は、クライアントにそうしないように指示することだと思います。しかし、あなたがそれを防ぐ必要があるなら、上記は機能するはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top