我已经制作了我的 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
最佳答案
如果您将此作为练习(仅使用现成的记录器不是一种选择),您可以尝试生产者/消费者系统。
- 要么制作一个
Init
记录器的函数,或使用静态构造函数 - 在其中启动一个新的System.Threading.Thread
,它刚好贯穿while(true)
循环。 - 创建一个新的
Queue<string>
并将您的日志记录功能排入队列。 - 你的
while(true)
循环查找队列中的项目,使它们出队,然后记录它们。 - 确保在任一线程上对队列执行任何操作之前锁定队列。
关于c# - 单独线程中的静态记录器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2957813/