非托管资源的线程/进程安全性

时间:2009-10-20 14:28:21

标签: c# .net operating-system

我们可能习惯于下面的代码:

if(File.Exists(xxx))
{
  //I am here
  using(var streamReader = new StreamReader("xxx"))
  {
    ...
  }
}

嗯,潜在的问题是,当代码到达“//我在这里”时,文件xxx可能会被另一个线程(或进程)删除。因此,using块将抛出异常。

无论如何要避免这种情况? (我不想在使用时有一个丑陋的尝试。)任何模式或通用实践来解决非托管资源的这种“线程/进程安全”问题?

谢谢,

2 个答案:

答案 0 :(得分:2)

使用try / catch。他们比他们看起来更漂亮。

如果您控制访问该文件夹的所有应用程序,则可以使用命名的互斥锁(跨appdomain-semaphore)。如果这是一个通常可访问的文件夹,问题并不是真的可以预防。

答案 1 :(得分:1)

当然,您可以使用系统范围的互斥锁来引入系统资源上的同步。但这在这里有点过分,无论如何你无法阻止不关心这些互斥锁的其他应用程序/进程删除文件。

所以我建议你在StreamReader上使用try / catch。