您好,感谢您的帮助。 这次我对一个程序(C#)有一个奇怪的问题,我正在写作,并希望听到你的建议。 我正在编写一个普通的程序(不是多线程),但后来添加了一个计时器(System.Timers.Timer)
我也在使用StreamWriter来写一个文件。我打开这个
StreamWriter logStream=new StreamWriter(filename, true);
意味着如果文件存在,它会附加,如果不存在则会附加。
后来我写了这样的文件
logStream.WriteLine(message);
但是,我从两个主函数和定时器调用的函数写入流。
问题症状
当我刷新或写入说“&34;无法访问已关闭的文件”的流时,我的程序有时会抛出错误。和其他时间"无法访问已关闭的TextWriter ...(什么是" TextWriter"?)
但奇怪的是,文件一直没有问题。 (即使"无法访问已关闭的文件"消息也写在假定的已关闭文件中)
我不熟悉Timer的内部工作原理。 (我想它运行一个单独的线程?)
我的问题是
是否可以使用多个线程的StreamWriter? (在这种情况下主要的一个和定时器一个) 是否有可能发生竞争条件或类似的问题?
还有一件事:我犯了一个逻辑错误,每次想要写它时关闭并重新打开文件。是的,这是一个错误,我应该纠正它。但也许如果我纠正这个错误,我上面描述的错误将消失,掩盖一个更严重的缺陷。
我怀疑是因为我正在关闭并打开文件我写的每个时间,也许两个线程都试图在错误的时间访问它们
非常感谢任何帮助
答案 0 :(得分:1)
在此方案下关闭并打开您的文件会产生您怀疑的竞争条件。您无法保持流打开并将对象传递给线程,因为如果从不同的线程调用,可能会遇到类似的问题。您的最佳解决方案仍然使用线程安全方法,该方法将写入您发送给它的内容。
方法是静态的,因为必须可以从类的所有实例访问锁。
private static ReaderWriterLockSlim readerWriterLockSlim = new ReaderWriterLockSlim();
public static void AppendToFile(string path, string text)
{
// Set to locked (other thread will freeze here until object is unlocked
readerWriterLockSlim.EnterWriteLock();
try
{
// Write that will append to the file
using (StreamWriter sw = File.AppendText(path))
{
// append the text
sw.WriteLine(text);
sw.Close();
}
}
finally
{
// Clear the lock
readerWriterLockSlim.ExitWriteLock();
}
}