c# - 单独线程中的静态记录器?

标签 c# logging synchronization logfiles

我已经制作了我的 Logger,它记录一个字符串,一个带有 static 的静态类 所以我可以从我的整个项目中调用它而不必创建它的实例。 非常好,但我想让它在一个单独的线程中运行,因为访问文件需要时间

这是否可能,最好的方法是什么?

描述有点简短,但我希望思路清晰。如果没有,请告诉我。

提前致谢!

顺便说一下,也欢迎对我的代码进行任何其他改进,我觉得并不是所有事情都尽可能高效:

internal static class MainLogger
    {
        internal static void LogStringToFile(string logText)
        {
            DateTime timestamp = DateTime.Now;
            string str = timestamp.ToString("dd-MM-yy  HH:mm:ss ", CultureInfo.InvariantCulture) + "\t" + logText + "\n";
            const string filename = Constants.LOG_FILENAME;
            FileInfo fileInfo = new FileInfo(filename);
            if (fileInfo.Exists)
            {
                if (fileInfo.Length > Constants.LOG_FILESIZE)
                {
                    File.Create(filename).Dispose();
                }
            }
            else
            {
                File.Create(filename).Dispose();
            }
            int i = 0;
            while(true)
            {
                try
                {
                    using (StreamWriter writer = File.AppendText(filename))
                    {
                        writer.WriteLine(str);
                    }
                    break;
                }
                catch (IOException)
                {
                    Thread.Sleep(10);
                    i++;
                    if (i >= 8)
                    {
                        throw new IOException("Log file \"" + Constants.LOG_FILENAME + "\" not accessible after 5 tries");
                    }
                }
            }
        }
    }
enter code here

最佳答案

如果您将此作为练习(仅使用现成的记录器不是一种选择),您可以尝试生产者/消费者系统。

  1. 要么制作一个Init记录器的函数,或使用静态构造函数 - 在其中启动一个新的 System.Threading.Thread ,它刚好贯穿 while(true)循环。
  2. 创建一个新的 Queue<string>并将您的日志记录功能排入队列。
  3. 你的 while(true)循环查找队列中的项目,使它们出队,然后记录它们。
  4. 确保在任一线程上对队列执行任何操作之前锁定队列。

关于c# - 单独线程中的静态记录器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2957813/

相关文章:

c# - 如何从本地共享文件夹 Pc 下载图像?

Azure Databricks 和日志分析设置需要重新启动或重建吗?

java - 事件驱动线程

multithreading - 什么是新手的原子操作?

node.js - Strongloop 环回自定义错误处理

android - android sqlite数据库和mysql数据库如何离线和在线同步数据?

c# - PING 的回复是否包含原始数据?

c# - mysql数据库关系问题

c# - 在 Asp.net session 中存储大量数据

c# - PostSharp - il 编织 - 想法