从多个线程写入.net 4.0中的一个文件

时间:2018-02-23 09:35:01

标签: multithreading .net-4.0 file-writing

我有一个场景,一个旧的巨大的控制台程序行为不端,有人在.net 4.0中写道并离开了公司。由于多线程有点难以调试,应用程序的工作流程也值得怀疑,如果没有对代码的评论,很难弄清楚在什么时候以及在哪个线程上实际发生的事情。

因此,这个想法开始创建多线程感知日志挂钩 因此,一个文件日志可以在任何我们喜欢的地方转储有关所有这些线程的信息。

我写了一些接缝来做它,虽然我不确定这个代码是否应该在.net 4.0中使用(锁确实保存了这个文件写的任务,我相信)..但不确定是否应该是一个队列左右,以便多个线程添加他们的文本和编写器,写入并出列。

另一方面,也许这已经足够了,然后我增加了很多复杂性,我最担心的是,由于Lock(锁定器),代码可能会被冻结。

public static class LogWriter
    {
        private static object locker = new Object();

        public static void Write ( string Filepath,string text )
        {
            lock (locker)
            {
                using (FileStream file = new FileStream(Filepath, FileMode.Append, FileAccess.Write, FileShare.Read))
                using (StreamWriter writer = new StreamWriter(file, Encoding.Unicode))
                {
                    writer.WriteLine(text);
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

一般来说,我认为您可以假设您的代码可以正常运行。如果多个线程同时调用Write,则lock将有效地使它们一次向文件追加文本。

在查看代码时会想到一些事情:

  • 每次拨打Write都会创建一个新的FileStreamStreamWriter并在最后处理它。这听起来非常昂贵,最好将filewriter保留在静态变量中并在最后关闭它们
  • 您对日志记录的调用将是同步的,因此任何记录的线程都将阻塞,直到日志记录完成。您可能希望异步执行此操作。

一般来说,我认为您最好的选择是查看一些现有的日志框架,看看是否可以使用它们。您不需要编写自己的“创建多线程感知日志记录挂钩”,其他人在您之前已经这样做了。

一些好的日志框架是NLog,Serilog,log4net,ELMAH ......我认为最好的办法是使用这些日志框架。