C#如何安全地结束保存到文件的线程

时间:2016-05-25 21:03:54

标签: c# multithreading file io persistence

我正在编写一个脚本,在应该保存的更改后自动保存3秒,如果发生其他更改,则希望3秒计时器重置。我也在使用线程,因为我不希望程序在磁盘忙等时口吃。

void SaveTimer() 
{
    Thread.Sleep(3000); //wait 3 seconds
    Save(); //writes binary file to disk
}

在上面的代码中,一个帖子以“StartTimer”开头。我可以杀死线程并在每次更改时再次启动它,但如果线程正在保存到磁盘中,则可能会导致问题。我不确定如何安全地重置等待的时间。任何想法都将不胜感激,谢谢。

3 个答案:

答案 0 :(得分:0)

从你的问题和随后的评论中我可以建议你两个选项,还有一些额外的“警告”:

  1. 如果您的线程在每次迭代时循环执行某些操作,您可以设置一个volatile布尔标志,以便在完成当前迭代后退出。
  2. 然后,当您希望线程停止时,将标志设置为true,并在下次检查条件时停止。

    1. 如果您不能等待迭代完成并需要立即停止它,您可以选择Thread.Abort,但要确保没有办法可以保留打开文件句柄,套接字,锁或其他任何东西这处于不一致的状态。

答案 1 :(得分:0)

1)我建议您在尝试写入之前检查此文件是否已写入

void SaveTimer() 
{
    try
    {
        using (Stream stream = new FileStream(filename, FileMode.Open))
        {
            yourTimer.Stop();
            Save();
            yourTimer.Start();
        }
    } 
    catch { Thread.Sleep(3000); }
    }
}
  1. 如果可能,最好重新计算代码以避免让线程进入休眠状态。

答案 2 :(得分:0)

根据数据的性质,您可能需要编写一个大的空文件,然后将其保持打开状态以在专用进程上进行读写。

无需重写文件,只需将需要更改的行传递到读/写线程。

为简单起见,文件应足够大以至于不需要增长。通过这种方式,您已经创建了一个基本数据库。