我目前正在研究用c#编写程序来处理日志文件。目的是日志文件不应超过50mb,所以我重命名文件并创建一个新文件,然后它应该开始写入新文件。为了避免在文件更改时将数据写入日志,我想在程序的一部分中我将数据添加到缓冲区,然后在程序的另一部分中读取缓冲区中的数据并将其输出到文件。如果它无法写入文件,则将其保留在缓冲区中,直到它可以写入文件。
我将如何做到这一点我似乎无法在Google上找到任何东西,不确定我是否正在搜索正确的东西。
感谢您提供的任何帮助
答案 0 :(得分:1)
答案 1 :(得分:1)
我建议使用BlockingCollection。想要写入日志的线程只是将日志字符串排入BlockingCollection
。一个单独的线程监视BlockingCollection
,对字符串进行排队并将它们写入文件。如果该文件不可用,则该线程可以等待并重试。
有关简单示例,请参阅http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=821。
如果您无法使用BlockingCollection
,则可以使用Queue并使用锁定保护它。您记录内容的方法变为:
private Queue<string> myQueue = new Queue<string>(); // owned by the logger
void WriteLog(string s)
{
lock (myQueue)
{
myQueue.Enqueue(s);
}
}
删除东西的线程可以从队列中获取它们。这将不太理想,因为它必须定期轮询,但它不应该太糟糕:
while (!shutdown) // do this until somebody shuts down the program
{
while (myQueue.Count > 0)
{
lock (myQueue)
{
string s = myQueue.Dequeue();
// write the string s to the log file
}
}
Thread.Sleep(1000); // sleep for a second and do it again.
}
如果没有繁忙的等待,有很多方法可以做到这一点,但我不记得实现细节。有关示例,请参阅http://msdn.microsoft.com/en-us/library/system.threading.monitor.pulse.aspx。