【问题标题】:How to perform file logging in a multithreaded app如何在多线程应用程序中执行文件日志记录
【发布时间】:2016-04-22 10:13:28
【问题描述】:

我需要一种极速记录的方法(有关高速摄像机的帧信息)。 它只是我需要记录的几个数字和一个简单的 file.log。 事件记录会为此减慢速度。

然后我想,只需创建一个文件流,这样我就可以为我的应用程序锁定文件。并附加到它。

通常我会使用一个简单的行,例如

Filestream fs = new FileStream(@"D:\Log.csv", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);

在方法内部。

但是,由于相机驱动程序的帧都是在一个新线程中执行的,所以我在这里遇到了问题。因为我不想在每次写入日志文件时重新打开和关闭文件。 (打开和关闭很慢)。

我想在我的程序开始时打开日志文件一次,线程应该只对其执行写入,而不是一次又一次地关闭和打开它。

如何实现这一点,因为这不起作用:

using System.IO;
FileStream fs = new FileStream(@"D:\Log.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);

    static void Main(string[] args)
    {
         // doing it in main doesn't work either.
         fs = new FileStream(@"D:\Log.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
       //...
       //.. init camera and start camera lots of code follows but is not related to the question.
     }

     Camera_Thread.FrameArrived (FrameArrivedEventArgs e)
    {   
       byte[] n = MyFilterFunction(e.frame);         
       fs.WriteByte(MyArrayToString(n));
    }

【问题讨论】:

  • “不起作用”非常不具体。请澄清实际问题是什么。
  • 为什么不使用TextWriterTraceListener
  • @LasseV.Karlsen,我尝试了几种声明这个文件的组合,编译器不会接受我如何尝试声明它,ea fs filestream 变量在 camera_thread.FrameArived 中没有被识别为 fs isnt一个全局变量
  • 我会使用一些日志库,比如 nlog
  • 这已在 NLog 和 Log4Net 等日志框架中得到解决。两者都支持异步写入磁盘并支持从多个线程记录到单个文件。

标签: c# multithreading logging


【解决方案1】:

有很多方法,但如果不是全部的话,大多数都涉及排队,尤其是在多线程环境中。

您可以使用 MSMQ 将日志排队等待处理,也可以使用单独的线程来处理内存队列中的日志。

string logFile = "Log.txt";
this.Queue = new ConcurrentQueue<string>();

var thread = new Thread(() => 
{
    string log;

    while (true)
    {
        while (!this.Queue.IsEmpty)
        {
            if (!this.Queue.TryDequeue(out log)) continue;

            File.AppendAllText(logFile, "\n" + log);
        }

        Thread.Sleep(1000);
    }

});

thread.Start();

这个实现没有考虑如何取消日志线程,所以我会让你先自己尝试。我还要补充一点,这不是很可靠,如果可以选择,我实际上会使用 MSMQ。

【讨论】:

  • 速度确实是我的问题,我需要极速登录。
  • 进程外排队对我来说似乎是一个奇怪的 I/O 问题解决方案。我认为这只会使问题变得更大。
  • 当然,但是如果应用程序崩溃,您将面临丢失存储在内存中排队等待处理的所有日志的风险
  • @MarnixvanValen 很好,我的程序需要 8 个 3.2Ghz 的 CPU 内核才能工作,所有代码都经过优化和优化。现实世界的问题并不总是简单的答案
  • 为什么不试试答案,如果遇到问题再回复我们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 2013-02-13
  • 2012-01-11
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
相关资源
最近更新 更多