状態のドキュメントNetworkStream
:
読み取り操作と書き込み操作は、同期を必要とせずに NetworkStream クラスのインスタンスで同時に実行できます。書き込み操作用に 1 つの固有のスレッドがあり、読み取り操作用に 1 つの固有のスレッドがある限り、読み取りスレッドと書き込みスレッドの間に相互干渉はなく、同期は必要ありません。
いいえ、複数のスレッドが同時にストリームに書き込みを行うべきではありません。複数のライターを持つ必要性を本当に感じている場合は、lock
(または他のメカニズム)を介してストリームへのアクセスを同期する必要があります。ただし、これを行うと、シリアル方式で効果的にストリームに書き込むことになります。そのため、物事を単純化し、実際にはライターが 1 つだけになるようにコードを構造化してください。
BlockingCollection
クラスを利用することで、1 つのライターでパターンを使用するのはかなり簡単です。これがどのように行われるかを示す簡単な例を次に示します。
public class Example
{
private NetworkStream networkstream = GetNetworkStream();
private BlockingCollection<byte[]> queue = new BlockingCollection<byte[]>();
public Example()
{
Task.Factory.StartNew(
() =>
{
foreach (byte[] buffer in queue.GetConsumingEnumerable())
{
this.networkstream.Write(buffer, 0, buffer.Length);
}
}, TaskCreationOptions.LongRunning);
}
public void QueueWrite(byte[] buffer)
{
queue.Add(buffer);
}
}