这是您在这里面临的两个不同的问题。
- 在文件关闭之前再次打开文件 - 这可以通过使用适当的共享标志打开来完成
- 同步访问它。这可以通过使用一些互斥锁来一次只允许 1 个线程访问文件来完成。这很重要,因为否则,您可能会让线程同时写入文件,这可能会导致问题,例如消息在 self.
这个带参数的FileStream 构造FileSharing
函数可以帮助您在关闭文件之前从几个线程打开文件。
但是,根据您的需要,最好将文件(例如,日志文件)的访问集中在一个地方(创建一个类,该类具有一个控制对该特定文件的访问的实例)并确保,它将通过锁定一些私有互斥锁来同步来自不同线程的访问,因此您不会同时从几个线程写入文件。
非常简单的示例,需要构建:
class Logger : IDisposable
{
private FileStream file; //Only this instance have a right to own it
private StreamWriter writer;
private object mutex; //Mutex for synchronizing
public Logger(string logPath)
{
file = new FileStream(logPath);
writer = new StreamWriter(file);
mutex = new object();
}
// Log is thread safe, it can be called from many threads
public void Log(string message)
{
lock (mutex)
{
writer.WriteLine(message);
}
}
public void Dispose()
{
writer.Dispose(); //Will close underlying stream
}
}
再一次,它非常简单,只是为了展示我们在这里试图实现的基本规则。
您在这里几乎没有其他选择:
- 使用现成的日志库(Log4Net 或 NLog(我个人更喜欢))
- 日志可以将消息添加到队列中,您可以有另一个线程,内部用于记录器从该队列读取消息并写入它们,这样,记录器的调用者将不必等待日志消息完成记录