2

.Net (4.0) には、1 つのスレッドがテキストを書き込み、もう 1 つのスレッドが読み取ることができる既存のクラスがありますか?

理想的には、次のような MemoryStream を使用します。

MemoryStream memStream = new MemoryStream();
TextWriter tw = new StreamWriter(memStream);
TextReader tr = new StreamReader(memStream);

//Consumer Thread
(new Thread(delegate() 
{
   while (true)
   {
       Console.WriteLine(tr.ReadLine());
   }
})).Start();

// Producer thread
(new Thread(delegate() 
{
   while (true)
   {
     Thread.Sleep(1000);       
     tw.WriteLine(System.DateTime.Now));
   }
})).Start();

これは機能しません。ストリームライターがストリーム内の位置を進め、シークで巻き戻さない限り、リーダーとライターの両方が位置ポインターに影響を与えて同時実行の問題が発生しない限り、リーダーには何も表示されないためです。

これはパイプまたはソケットで行うことができますが、どちらもやり過ぎです。ロック付きの RYO コードも同様に奇妙に思えます。

4

2 に答える 2

1

使用できますBlockingCollection<string>。1 つのスレッドからアイテム (テキスト) をコレクションに追加し、別のスレッドからTryTakeorを使用するだけGetConsumingEnumerableです。

于 2013-04-03T21:24:15.117 に答える
1

ABlockingCollectionは機能しますが、Stream セマンティクスが必要な場合は少し奇妙です。

フレームワークには何もありません。私はそれを行うために私が呼​​んだものを作成ProducerConsumerStreamしました。新しいタイプのストリームの構築を参照してください。

于 2013-04-03T22:24:25.733 に答える