多线程时是否可以使用ConcurrentQueue写入StreamWriter-我需要计时器机制和/或锁定吗?

时间:2018-10-16 09:16:10

标签: queue streamwriter ioexception

我正在尝试使用ConcurrentQueue以便从多个线程写入同一文件时不会出现错误:

IOException: The process cannot access the file because it is being used by another process.

建议使用ConcurrentQueue。

public class LogWriter
  {
    ConcurrentQueue<string> cq = new ConcurrentQueue<string>();
    static string outputFile => $"c:\\Test\\LogTest.txt";

    public LogWriter()
    {

    }

    public void Log(string line)
    {
      cq.Enqueue(line);
      Write();
    }

    public void Write()
    {
      string queueItemToWrite;
      while (cq.TryDequeue(out queueItemToWrite))
      {
        using (StreamWriter writer = File.AppendText(outputFile))
        {
          writer.WriteLine(queueItemToWrite);
        }
      }

    }
  }

我怀疑上面的操作失败了,因为cq.TryDequeue不知道流写入器何时完成,因此在写入流写入器时将卸载,从而导致预期的异常。因此,我不得不在流写入器周围加锁,这违背了队列的目的。

我还看到其他线程使用计时器,每5秒增加一个队列,然后刷新队列。

在此项目中,我不能使用log4net或其他任何东西-我也希望以此形式学习并了解如何在其他情况下使用这些知识。

我应该如何调整将ConcurrentQueue与StreamWriter一起使用的逻辑?

class Program
  {
    static void Main(string[] args)
    {
      LogWriter w = new LogWriter();

      int[] arr = Enumerable.Range(1, 100).ToArray();
      Parallel.ForEach(arr, (arrayItem) =>
         {
           w.Log(arrayItem.ToString());
         });
     }

  }

0 个答案:

没有答案