我正在尝试使用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());
});
}
}