Я пытаюсь использовать 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());
});
}
}