アプリケーションで不可解な動作が発生しています。
スレッドを作成します。これをワーカーと呼びましょう。これは、通信要求の処理を担当します。スレッドが要求を消費してメッセージを送信している間、クライアントはパイプに書き込みます。
これで、スレッドのメイン ループは次のようになります。
lock(this)
{
object_id = Transport.BeginSend(xxx, xxx, callback, yyy)
clientsObjects[object_id] = client_id;
}
ここで、コールバックは client_id にアクセスする必要があります (私が書いたものよりも少し複雑ですが、問題は、コールバックが object_id を受け取ることです。BeginSend がへの呼び出しであると想定してください)。UdpClient.BeginSend
void Callback(IAsyncResult ar)
{
State st = (State)ar;
lock(this)
{
client_id = clientsObjects[st.object_id]
}
}
clientsObjects[object_id] = client_id;
ロックが存在するのは、コールバックが非常に高速に起動する可能性があるため、実行前に実際に発生する可能性があるためです...
わかりました、今..問題は、それが機能していないことです。まあ、時々機能します...なぜですか?BeginSend を実行しているスレッドとコールバックを実行しているスレッドの ManagedThreadIds をトレースすると、同じ ThreadId を持っていることが時々わかります!!
それは可能ですか?どうすればそれが起こりますか?私が間違っていることについて何か提案はありますか?
コメント: 実際のコードはまったく同じではありません。Transport は UDPClient のラッパーであり、トランスポート層を簡単に変更できます。ロックは実際にはロックではなくスピンロックです ... しかし、概念自体は多かれ少なかれ私が書き留めたものです.