2
byte [] buffer = new byte [4];
buffer = "AAA";
this.networkStream.Write(buffer , 0 , 4);
this.networkStream.Flush();

複数のスレッドをすべて同じソケットを使用して開始し、ソケットを介して同時にストリームを送信できますか?

2 つのスレッドがある場合、1 つは 4 文字の AAA のバッファを送信し、もう 1 つのスレッドは BBB です。

もう一方の端のデータは、AAABBB または混合文字 ABABAB のように見えますか?

4

1 に答える 1

8

状態のドキュメント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);
  }
}
于 2013-11-13T15:44:38.177 に答える