2016-06-21 10 views
0

私のカスタムクラスのインスタンスを作成したいと思います。たとえば、2つのスレッドT1T2があります。 T1からインスタンスを作成した場合、そのインスタンスへのアクセスはT2から例外をスローする必要があります。 WinFormsのように、私はUIスレッドではないスレッドからアクセスコントロールを試みます。呼び出し元のスレッドがオブジェクトを作成したスレッドでない場合は例外をスローする

これを行うには? current threadへの参照を保存する必要がありますか、現在のスレッドのunique IDを保持する必要がありますか? (そのIDが存在する場合)。どのメカニズムを使用するのですか?

基本的には、与えられたシードの乱数を生成するシングルトンになります。自分のシナリオを再現するために同じシードで再度アプリケーションを実行する必要があるため、このシングルトンへのアクセスを他のスレッドからブロックしたいのです。このクラスを他のスレッドから使​​用するようにすれば、スレッドは予期しない順序でアクションを開始/停止/実行するので、再生はできません。

+0

なぜですか?スレッドセーフであるようにコードを修正してみませんか?乱数を返すメソッドの単純な 'lock(){..}'は十分なはずです –

+0

http://stackoverflow.com/a/7610982/574632 – Steve

+0

アクセスしたいだけの場合は、シングルトンは必要ありませんメインフォームのオブジェクトまたは単一のオブジェクト。 –

答えて

3

私はその目的でThread.CurrentThread.ManagedThreadIdを使用できると思います。

ただし、これらのIDはしばらくの間再利用される可能性があるため、アプリケーションの有効期間にわたって一意ではない可能性があります。しかし、あなたが記述したシナリオを考えると、これは問題ではないと私は考えています。

また、「ガード」は、使用方法と場所によっては非同期コーディングではうまく動作しない可能性があることに注意する必要があります。

+0

ManagedThreadIdを再利用できるのであれば、それは私には良いことではありません。しかし、私はメインスレッドでクラスを作成するので、動作します。しかし、参照を格納するかどうかは良いですか? – zgnilec

+0

長時間実行されているアプリケーションでは、32ビットのIDはすべて時間の経過とともに再利用される可能性があります。また、スレッドを再利用できるスレッドプールがあります(もちろん同じIDを保持しています)。それは状況に非常に依存します。どの時点でも、2つのIDが衝突することはありません。したがって、私がすでに書いたように、あなたのケースでは、「認可された」スレッドが生存していると仮定して、 。 – Lucero

+0

現在私はInitialize()メソッドでThread.CurrentThreadへのプライベートフィールド参照を格納しています。そして、私はいくつかの重要なメソッド、私はsomethindが好きです:ロック(...){if(Thread.CurrentThread!= savedThreadReference)throw InvalidOperationException( "Cross-thread ...");いいですか? – zgnilec

関連する問題