【发布时间】:2021-02-10 13:57:21
【问题描述】:
我正在开发一个Form 应用程序,该应用程序假设可以同时在一个网络中的多台机器上运行。我的应用程序中有一个表单(我们称之为Form1),您可以从中编辑位于网络上的XML 文件。为了防止这个文件被覆盖,我必须确保一次只有一个人可以访问Form1。
我的第一次尝试是在XML 文件中创建一个属性,以指示何时有人已经在访问Form1。该解决方案的问题在于,在突然崩溃(如停电)的情况下,该属性不会更改回其正常值,因为Form1 从未正确退出。因此,您必须手动更改 XML 文件中的值。
我当前的解决方案在Form1 中运行一个线程,该线程不断读取文件,直到Form1 再次关闭。并在允许其他人访问Form1 之前检查文件是否已被读取。此解决方案工作正常,但它并不漂亮,因为我必须有一个额外的文件,其唯一目的是读取,因为我不能经常读取 XML 文件本身而不会导致其他问题。
编辑:由于第一个答案与我当前的解决方案相同,这里是我当前解决方案的代码。
//CODE INSIDE FORM1
//Create thread which is reading File2
Thread readerThread = new Thread(new ThreadStart(ReadFile2));
readerThread.Start();
private void ReadFile2()
{
using (FileStream stream = File.Open(pathFile2, FileMode.Open, FileAccess.Read, FileShare.None))
{
//Wait until Form1 is being closed
threadWait.WaitOne();
stream.Close();
}
}
//CODE BEFORE ACCESSING FORM1
private bool Form1OpenCheck()
{
//Check if file2 is being read
bool noAccess = false;
try
{
using (FileStream stream = File.Open(pathFile2, FileMode.Open, FileAccess.Read, FileShare.None))
{
stream.Close();
}
}
catch (IOException)
{
noAccess = true;
}
return noAccess;
}
如果有人对此问题有更好的解决方案,我将不胜感激。谢谢。
【问题讨论】:
-
如果您在尝试使用文件之前尝试检查文件是否被锁定为单独的步骤,您将遇到基本的竞争条件。代码可以发现该文件可用,但在检查方法返回之前,另一个进程可能会锁定该文件。最好的解决方案是尝试更改文件并捕获和处理适当的异常。
标签: c# xml winforms file-access