将数据写入缓冲区并从缓冲区读取数据

本文关键字:缓冲区 数据 读取 | 更新日期: 2023-09-27 18:31:47

我目前正在考虑用c#编写一个处理管理日志文件的程序。目的是日志文件不应超过 50mb,所以我正在重命名该文件并创建一个新文件,然后它应该开始写入新文件。为了避免在文件更改时将数据写入日志,我认为在程序的一部分中将数据添加到缓冲区,然后在程序的另一部分中读取缓冲区中的数据并将其输出到文件。如果它无法写入文件,它会将其保留在缓冲区中,直到它可以写入文件。

我将如何做到这一点,我似乎无法在Google上找到任何内容,不确定我是否在搜索正确的东西。

感谢您提供的任何帮助

将数据写入缓冲区并从缓冲区读取数据

这听起来像是一个经典的生产者消费者问题。这是一个很好的起点。

阻止收集

正如其他人所指出的那样,使用库比重新发明轮子更好。Log4net是一个很好的日志记录库。

我建议使用BlockingCollection。想要写入日志的线程只是将日志字符串排队到BlockingCollection。一个单独的线程监视BlockingCollection,取消字符串的队列并将它们写入文件。如果文件不可用,线程可以等待,然后重试。

有关一些简单示例,请参阅 http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=821。

如果您不能使用 BlockingCollection ,则可以使用队列并使用锁保护它。您记录某些内容的方法变为:

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。