1

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

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
    }
}
4

5 回答 5

2

如果您只是从文件中读取,那么您应该能够传递一个标志来指定共享模式。我不知道你如何在 .NET 中指定它,但在 WinAPI 中你会传递FILE_SHARE_READ | FILE_SHARE_WRITECreateFile().

我建议你检查你的文件 API 文档,看看它在哪里提到了共享模式。

于 2008-10-20T12:29:41.180 回答
1

两件事情:

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

HTH。

于 2008-10-20T12:50:30.577 回答
0

问题是不同的,因为该人对所有进程的文件访问具有完全控制权,而正如我所提到的,一个进程是没有源访问权限的第三方。我们的应用程序运行良好。但是,如果他们无法控制文件,他们的应用程序似乎会卡住。所以我愿意找到一种不会干扰他们运行的文件访问方法。

于 2008-10-20T11:54:28.613 回答
0

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

于 2008-10-20T21:12:44.977 回答
0

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

string xmlText = File.ReadAllText(ManifestFile);

另请参阅:MSDN 上的 File.ReadAllText

于 2008-10-20T23:56:16.957 回答