7

関連するネットワーク ストリームでTcpClient非同期を呼び出した場合に.NET を使用すると、別のスレッドでそのストリームを呼び出すことはできますか?BeginRead()Write()

またはlock()TcpClientからコールバックされるBeginReadコードと、送信を行うコードを使用する必要がありますか?

また、次のように閉じるTcpClientと:

client.GetStream().Close();
client.Close();

私もそうしなければなりませんlock()TcpClient

4

1 に答える 1

9

クラスのドキュメントで説明されているように、の読み取り/書き込み部分TcpClientはスレッドセーフです(これは実際のIOに使用されます)。NetworkStreamTcpClient

読み取りおよび書き込み操作は、同期を必要とせずにNetworkStreamクラスのインスタンスで同時に実行できます。書き込み操作用に1つの固有のスレッドがあり、読み取り操作用に1つの固有のスレッドがある限り、読み取りスレッドと書き込みスレッドの間に相互干渉はなく、同期は必要ありません。

クローズを行うには、TcpClientあるスレッドでを閉じた後、閉じた後に別のスレッドでそれを使用して読み取り/書き込みを行おうとすると、例外がスローされます。スレッドを閉じる前に同期して、を使用しないようにするTcpClientか、例外をキャッチして処理することができます(たとえば、スレッドの実行ループを終了する場合があります)。

于 2010-04-06T07:52:14.597 に答える