我们可能习惯于下面的代码:
if(File.Exists(xxx))
{
//I am here
using(var streamReader = new StreamReader("xxx"))
{
...
}
}
嗯,潜在的问题是,当代码到达“//我在这里”时,文件xxx可能会被另一个线程(或进程)删除。因此,using块将抛出异常。
无论如何要避免这种情况? (我不想在使用时有一个丑陋的尝试。)任何模式或通用实践来解决非托管资源的这种“线程/进程安全”问题?
谢谢,
答案 0 :(得分:2)
使用try / catch。他们比他们看起来更漂亮。
如果您控制访问该文件夹的所有应用程序,则可以使用命名的互斥锁(跨appdomain-semaphore)。如果这是一个通常可访问的文件夹,问题并不是真的可以预防。
答案 1 :(得分:1)
当然,您可以使用系统范围的互斥锁来引入系统资源上的同步。但这在这里有点过分,无论如何你无法阻止不关心这些互斥锁的其他应用程序/进程删除文件。
所以我建议你在StreamReader上使用try / catch。