0

我想将文本打印到文件中,但我想确保不会通过写入磁盘来阻止主线程。

我使用 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");
4

0 回答 0