2

さて、これはかなり奇妙な質問ですが、状況はこれです。私が取り組んでいる通信ライブラリがあり、その多くの機能の1つは、ソケットからのすべての着信パケットを受け入れ、必要に応じてそれらを実行するバックグラウンドスレッドです。最も単純な形式では、要求または要求への応答のいずれかを持つことができます。複数のスレッドは、このライブラリを使用して同じソケットでリクエストを送信し、応答が到着したときにバックグラウンドスレッドからのシグナル(イベント)を待機することで送信できます。

バックグラウンドスレッドに関連付けられたデリゲートを定義して、着信要求で発生することを処理します。つまり、このデリゲートからリクエストを送信してみることができます。これはすべてバックグラウンドの受信スレッドと同じスレッド上にあるため、デッドロックになります(スレッドはブロックされ、応答を待機しますが、これは決して発生しません)。これらは私とほとんどの人が避けることを知っている状況ですが、例外をスローする方法があるか、プログラマーがリクエストを送信する特定のメソッドを呼び出そうとしないようにコンパイル時チェックをしたいと思います。受信を処理するスレッドから。

4

2 に答える 2

2

を使用Thread.CurrentThread.ManagedThreadIdして、現在実行中のスレッドを識別し、ターゲットスレッドのIDと比較して決定を下すことができます。

于 2012-05-19T11:43:55.653 に答える
2

スレッドに名前を付けることができます

Thread.CurrentThread.Name = "Any name you like";

または、スレッドIDを保持する静的フィールドを作成できます

SomeClass.RequestSenderThreadId = Thread.CurrentThread.ManagedThreadId;

そしてあなたの方法で

if(SomeClass.RequestSenderThreadId == Thread.CurrentThread.ManagedThreadId)
{
    throw new OperationException("You cant use this method in this thread");
}
于 2012-05-19T11:44:28.000 に答える