0

スレッドを起動してそれを実行し、WaitHandleを呼び出し元に返すライブラリを構築しました。

バグレポートを見ると、ライブラリを呼び出しているコードが、返されたオブジェクトを取得してAutoResetEvent(つまり)にキャストし、フラグ自体を上げているのではないかと思います。それをするためのものではありません。

AutoResetEventオブジェクトを、WaitOne'dおよびWaitAny'dのままで、コードでのみ発生させることができるオブジェクトでラップする方法はありますか?

ありがとう。

4

1 に答える 1

0

派生しEventWaitHandleてオーバーライドする新しいクラスを作成SetResetて、何もしないか、例外をスローすることができます。実際には、仮想ではないnewため、実装を作成する必要があります。もちろん、独自の別の名前のメソッドを作成する必要があります。のように。可能ですが、それを行うことはお勧めしません。SetResetMyInternalSetMyInternalReset

代わりに、クライアントがイベントを設定またはリセットしてはならないことを文書化します。そうすると、予期しない動作が発生するためです。

をプロパティとしてWaitHandle保持する派生クラスを作成できます。その場合、クライアントコードはそれにアクセスできなくなります。何かのようなもの:AutoResetEventinternal

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の実装を作成するか、コードでを呼び出すことができます。SetResetInternalHandle.Set

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

于 2011-06-10T23:30:22.637 に答える