计时器,文件和竞争条件?

时间:2016-09-09 11:18:22

标签: c# timer streamwriter

您好,感谢您的帮助。 这次我对一个程序(C#)有一个奇怪的问题,我正在写作,并希望听到你的建议。 我正在编写一个普通的程序(不是多线程),但后来添加了一个计时器(System.Timers.Timer)

我也在使用StreamWriter来写一个文件。我打开这个

StreamWriter logStream=new StreamWriter(filename, true);

意味着如果文件存在,它会附加,如果不存在则会附加。

后来我写了这样的文件

logStream.WriteLine(message);

但是,我从两个主函数和定时器调用的函数写入流。

问题症状

当我刷新或写入说“&34;无法访问已关闭的文件”的流时,我的程序有时会抛出错误。和其他时间"无法访问已关闭的TextWriter ...(什么是" TextWriter"?)

但奇怪的是,文件一直没有问题。 (即使"无法访问已关闭的文件"消息也写在假定的已关闭文件中)

我不熟悉Timer的内部工作原理。 (我想它运行一个单独的线程?)

我的问题是

是否可以使用多个线程的StreamWriter? (在这种情况下主要的一个和定时器一个) 是否有可能发生竞争条件或类似的问题?

还有一件事:我犯了一个逻辑错误,每次想要写它时关闭并重新打开文件。是的,这是一个错误,我应该纠正它。但也许如果我纠正这个错误,我上面描述的错误将消失,掩盖一个更严重的缺陷。

我怀疑是因为我正在关闭并打开文件我写的每个时间,也许两个线程都试图在错误的时间访问它们

非常感谢任何帮助

1 个答案:

答案 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();
    }
}