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

C#如何安全结束保存到文件的线程,c#,multithreading,file,io,persistence,C#,Multithreading,File,Io,Persistence,我正在编写一个脚本,该脚本在应该保存的更改后自动保存3秒,并希望在再次发生更改时重置3秒计时器。我也使用线程,因为我不希望程序在磁盘忙时结巴 void SaveTimer() { Thread.Sleep(3000); //wait 3 seconds Save(); //writes binary file to disk } 在上面的代码中,线程以“StartTimer”开头。我可以杀死线程,并重新启动,每次有一个变化,但这可能会导致问题,如果线程是在中间保存到磁盘。我不

我正在编写一个脚本,该脚本在应该保存的更改后自动保存3秒,并希望在再次发生更改时重置3秒计时器。我也使用线程,因为我不希望程序在磁盘忙时结巴

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

在上面的代码中,线程以“StartTimer”开头。我可以杀死线程,并重新启动,每次有一个变化,但这可能会导致问题,如果线程是在中间保存到磁盘。我不确定如何安全地重置等待的时间。如果您有任何想法,我们将不胜感激。

从您的问题和随后的评论中,我可以向您推荐两种选择,并附加一些“警告”:

  • 如果线程循环在每次迭代中执行某些内容,则可以设置一个volatile boolean标志,使其在完成当前迭代后退出
  • 然后,当您希望线程停止时,只需将标志设置为true,它将在下次检查条件时停止

  • 如果您不能等待迭代完成并需要立即停止它,可以选择Thread.Abort,但绝对要确保无法将打开的文件句柄、套接字、锁或类似的任何东西保持在不一致的状态

  • 从您的问题和随后的评论中,我可以向您建议两个选项,并附加一些“警告”:

  • 如果线程循环在每次迭代中执行某些内容,则可以设置一个volatile boolean标志,使其在完成当前迭代后退出
  • 然后,当您希望线程停止时,只需将标志设置为true,它将在下次检查条件时停止

  • 如果您不能等待迭代完成并需要立即停止它,可以选择Thread.Abort,但绝对要确保无法将打开的文件句柄、套接字、锁或类似的任何东西保持在不一致的状态
  • 1) 我建议您在尝试写入此文件之前,检查是否已写入此文件

    void SaveTimer() 
    {
        try
        {
            using (Stream stream = new FileStream(filename, FileMode.Open))
            {
                yourTimer.Stop();
                Save();
                yourTimer.Start();
            }
        } 
        catch { Thread.Sleep(3000); }
        }
    }
    
  • 如果可能,最好重新考虑代码,以避免线程休眠。
  • 1) 我建议您在尝试写入此文件之前,检查是否已写入此文件

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

  • 根据数据的性质,您可能希望写入一个大的空文件,然后将其打开,以便在专用进程上进行读写

    不需要重写文件,只需将需要更改的行传递给读/写线程即可


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

    根据数据的性质,您可能希望写入一个大的空文件,然后将其打开,以便在专用进程上进行读写

    不需要重写文件,只需将需要更改的行传递给读/写线程即可


    为了简单起见,文件应该足够大,不需要增长。这样,您就创建了一个基本的数据库。

    参见类似问题的答案参见类似问题的答案睡眠可以通过中断调用中断。睡眠可以通过中断调用中断。