C# 如何避免文件阻塞

C# 如何避免文件阻塞,c#,.net,multithreading,file-io,C#,.net,Multithreading,File Io,我们正在监视一个定制应用程序(其源不在我们的控制之下)写入XML清单的进度。有时,应用程序由于无法写入清单文件而被卡住。尽管我们通过使用file.Close显式关闭文件句柄并在使用块中创建文件变量来覆盖跟踪。但不知何故,它一直在发生。(我们的应用程序是多线程的,最多可以有三个线程访问该文件。) 另一件有趣的事情是,他们的应用程序在三个不同的事件(添加项目、删除项目、完成项目)中更新此清单,但我们只遇到一个事件(完成项目)。我的代码列在这里 using (var st = new FileStre

我们正在监视一个定制应用程序(其源不在我们的控制之下)写入XML清单的进度。有时,应用程序由于无法写入清单文件而被卡住。尽管我们通过使用file.Close显式关闭文件句柄并在使用块中创建文件变量来覆盖跟踪。但不知何故,它一直在发生。(我们的应用程序是多线程的,最多可以有三个线程访问该文件。) 另一件有趣的事情是,他们的应用程序在三个不同的事件(添加项目、删除项目、完成项目)中更新此清单,但我们只遇到一个事件(完成项目)。我的代码列在这里

using (var st = new FileStream(MenifestPath, FileMode.Open, FileAccess.Read))
{
    using (TextReader r = new StreamReader(st))
    {
       var xml = r.ReadToEnd();
           r.Close();
           st.Close();
          //................ Rest of our operations
    }
}

问题是不同的,因为这个人对所有进程的文件访问拥有完全控制权,而正如我提到的,一个进程是没有源访问的第三方。我们的应用程序运行良好。然而,如果他们无法获得文件的控制权,他们的应用程序似乎被卡住了。因此,我愿意找到一种不干扰其运行的文件访问方法。

如果您只读取文件,那么您应该能够传递一个标志来指定共享模式。我不知道您是如何在.NET中指定这个的,但是在WinAPI中,您会将
文件\u共享\u读取|文件\u共享\u写入
传递到
创建文件()

我建议您查看文件API文档,看看其中提到了共享模式。

两件事:

  • 您应该使用语句在
    范围之外执行其余操作。这样,您就不会冒使用封闭流和读卡器的风险。另外,您不需要使用
    Close
    方法,因为当您退出
    using
    语句的作用域时,会调用
    Dispose
    ,这是等效的
  • 您应该使用具有
    FileShare
    枚举的重载。锁定本质上是偏执的,因此文件可能会自动锁定以保护您免受自己的伤害。:)
    HTH.

    如果一个线程试图读取文件,而另一个线程正在写入,则可能发生这种情况。要避免这种一次需要多个读卡器但只需要一个写卡器的情况,请使用System.Threading命名空间中的ReaderWriterLock或.NET 2.0中的ReaderWriterLockSlim类。

    此外,如果使用.NET 2.0+,可以将代码简化为:

    string xmlText = File.ReadAllText(ManifestFile);
    

    另请参见:。

    是的,有一个FileShare常量。谢谢,我将尝试一下,看看它是如何工作的。谢谢,添加了一个FileShare常量,这两个应用程序的线程似乎相互理解。由于我们的应用程序正在读取,所以我对其他文件使用了READ_WRITE属性。因此他们的应用程序总是打开该文件。希望下面的链接有帮助。正确的做法是使用锁定,这样线程就不会同时尝试访问文件。当我有多个线程登录到同一个文件时,它为我工作。创建一个库来管理对文件的访问,您就成功了。