最简单的异步TextWriter到TextReader流/管道

时间:2013-04-03 21:20:49

标签: c#-4.0 iostream producer-consumer

.Net(4.0)是否有一个现有的类允许一个线程写文本而另一个线程读取?

理想情况下,我会使用像:

这样的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();

这不起作用,因为streamwriter在流中推进Position并且读取器将看不到任何内容,除非它与Seek一起回退,这会导致读取器和写入器影响位置指针的并发问题。

这可以做管道或插座,这两者都是过度的。带锁的RYO代码似乎同样很奇怪。

2 个答案:

答案 0 :(得分:1)

您可以使用BlockingCollection<string>。只需从一个帖子中将项目(文本)添加到集合中,然后使用另一个线程中的TryTakeGetConsumingEnumerable

答案 1 :(得分:1)

BlockingCollection会起作用,但如果你想要Stream语义,那就有点奇怪了。

框架中没有任何内容。我创建了我所谓的ProducerConsumerStream来做它。请参阅Building a new type of stream