c#-4.0 - 最简单的异步 TextWriter 到 TextReader 流/管道

标签 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();

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

这可以通过管道或套接字来完成,这两者都太过分了。带锁的 RYO 代码看起来同样奇怪。

最佳答案

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

关于c#-4.0 - 最简单的异步 TextWriter 到 TextReader 流/管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15798366/

相关文章:

c# - 将 BigInteger 乘以 Double

linq - 在 C# 中从 XML 解析 CData

.net - 我们是否有 bool 值的 Button down 属性

c++ - 在 C++ 中读取文件时没有得到正确的输出

c# - WCF 客户端接收空响应值

java - 如何为替代生产者和消费者方法编写 Java 多线程代码。它应该有 3 个生产者(P1、P2、P3)和 1 个消费者(C1)

c# - C#编译器使用CodeDomProvider的详细输出

c++ - 简单的用户定义文字编译失败

c++ - Windows api SIZE_T 在内存和控制台中不显示相同的值

java - 多线程访问同一个文本文件