2

.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();

这不起作用,因为流编写器在流中推进 Position 并且阅读器将看不到任何东西,除非它使用 Seek 倒带,这会在阅读器和编写器影响位置指针时产生并发问题。

这可以通过管道或套接字来完成,这两者都是多余的。带锁的 RYO 代码似乎同样奇怪。

4

2 回答 2

1

You can use BlockingCollection<string>. Just add items (text) to the collection from one thread, and use TryTake or GetConsumingEnumerable from the other.

于 2013-04-03T21:24:15.117 回答
1

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

框架中没有任何内容。我创造了我称之为 aProducerConsumerStream的东西。请参阅构建一种新型流

于 2013-04-03T22:24:25.733 回答