我想将文本打印到文件中,但我想确保不会通过写入磁盘来阻止主线程。
我使用 BlockingCollection 创建了以下方案。
我有一个包含 60 秒 TryTake 的无限循环。
谁能告诉我他们是否发现这种方法的效率有任何问题?我相信只要将新的 txt 添加到集合中,它就会写入磁盘,否则等待 60 秒。所以它在等待输入时没有旋转。
以前,我使用了非阻塞收集方法和 2 个队列,每隔几秒切换一次。一个队列有新的 txt,而我将另一个写入磁盘。这意味着在写入磁盘之前会有一些延迟,如果发生崩溃,我可能会丢失最后的数据。
public class OutputHandler
{
public BlockingCollection<string> O = new BlockingCollection<string>();
public string fileName;
public OutputHandler(string _fileName)
{
fileName = _fileName;
}
public OutputHandler(string _fileName, bool forceBackgroundPrint = false)
{
fileName = _fileName;
if (forceBackgroundPrint)
{
Task.Factory.StartNew(() =>
{
BackgroundPrint();
});
}
}
private void BackgroundPrint()
{
using(var stream = new StreamWriter(fileName, true))
{
string txt;
while (true)
{
if (O.TryTake(out txt, 60000))
{
stream.WriteLine(txt);
stream.Flush();
}
}
}
}
public void WriteLine(string txt)
{
O.Add(DateTime.UtcNow.ToString("yyyyMMddTHHmmss.fff ") + txt);
}
}
利用:
OutputHandler OUT = new OutputHandler("C:/test.txt",true);
OUT.WriteLine("Whatever");