将数据写入缓冲区并从缓冲区读取数据
我目前正在研究编写一个处理日志文件的程序。目的是日志文件不应超过50MB,所以我正在重命名该文件并创建一个新文件,然后它应该开始写入新文件。为了避免在文件更改时将数据写入日志,我在考虑在程序的一部分中将数据添加到缓冲区,然后在程序的另一部分中读取缓冲区中的数据并将其输出到文件。如果它不能写入文件,它会将它保存在缓冲区中,直到它可以写入文件。将数据写入缓冲区并从缓冲区读取数据
我该如何去做这件事我似乎无法在Google上找到任何东西,不知道我是否在寻找正确的东西。
感谢您的帮助,您可以提供
我建议使用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。
这不能用作它的.net 4,我的程序必须是.net 3.5 – Boardy 2012-04-20 14:15:32
@Boardy:查看我更新的答案。 – 2012-04-20 15:40:16
为什么不让记录仪本身决定何时旋转日志?这样你就没有任何争论。 – 2012-04-19 21:30:24
尝试[log4Net](http://logging.apache.org/log4net/) – 2012-04-19 21:32:40
Log4Net相当不错。 – Sandeep 2012-04-19 21:34:03