Могу ли я использовать ConcurrentQueue для записи в StreamWriter при многопоточности - нужен ли мне механизм таймера и / или блокировка? - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь использовать 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 не знает, когда завершается потоковая запись, и, таким образом, будет выгружаться при записи в потоковую запись, вызывая ожидаемое исключение.Таким образом, я должен поставить блокировку на streamwriter, который отрицает назначение очереди.

Я также видел, как другие потоки использовали таймер и увеличивали очередь каждые 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());
         });
     }

  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...