【问题标题】:2 Threads, 1 File2 个线程,1 个文件
【发布时间】:2013-01-07 11:26:07
【问题描述】:

既然this 无法轻易解决,我该如何实现 1 个线程,该线程使用Console.WriteLine() 逐行写入 字符串到文件/缓冲区,另一个线程读取 来自同一个文件/缓冲区的那些字符串也是逐行的吗?我想我需要:

  • 将控制台重定向到文件/缓冲区
  • 读取文件/缓冲区线程保存,写入一行时必须由其他线程读取
  • 使其异步(不是ReadToEnd(),它必须是实时

【问题讨论】:

  • 这是一个有点臭的要求:你能描述一下你首先要达到的目标吗?
  • Soner,我建议你看看一些并发概念,也许你会通过使用监视器或信号量来达到你的目标。干杯。
  • 我更喜欢缓冲版本。但文件似乎更容易。如果您知道避免使用缓冲区文件的简单方法,请告诉我。 @Soner 文本数据不敏感,功能很简单,所以我不关心监视器和信号量。我只是不想错过字符串。

标签: c# multithreading file stream


【解决方案1】:

尝试Memory-Mapped files 它将允许您从多个线程读取写入到一个共享文件。至于重定向控制台尝试:

Console.SetIn

Console.SetOut

【讨论】:

    【解决方案2】:

    不过,我想用 缓冲区 来做到这一点。

    文件解决方案:

        class Program
        {
            private static bool terminated = false;
    
            private static void listen()
            {
                StreamReader file = new StreamReader(new FileStream("C:/test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
                while (!terminated || !file.EndOfStream)
                    if (!file.EndOfStream)
                    {
                        string text = file.ReadLine();
                        MessageBox.Show(text); // display it
                    }
            }
    
            static void Main(string[] args)
            {
                StreamWriter sw = new StreamWriter(new FileStream("C:/test.txt", FileMode.Create, FileAccess.Write, FileShare.Read));
                sw.AutoFlush = true;
                Console.SetOut(sw);
                new Thread(new ThreadStart(listen)).Start();
                for (int i = 0; i < 10; i++)
                {
                    Thread.Sleep(250);
                    Console.Out.WriteLine("hello world - " + i);
                }
                terminated = true;
            }
        }
    

    逐行工作,不会漏掉一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 2021-11-17
      • 2018-07-10
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多