【发布时间】:2012-10-14 10:11:06
【问题描述】:
来自 cmets 的解决方案:
应用程序崩溃是由另一个问题引起的
我正在从 2 个不同的应用程序读取/写入文件,当文件被读取或写入时,它将始终被应用程序 A 或 B 锁定,并且它们都使用FileShare.None。
我的问题是,即使将阅读器包裹在 try/catch 周围,它仍然会在 using 行使用 IOException 使应用程序崩溃(写入器不会发生)。
我也把它写成了catch (IOException ...,我相信除了让它更具可读性之外没有什么区别。
文件被锁定时忽略并继续尝试直到文件可用的正确方法是什么?
while (true)
{
try
{
using (FileStream stream = new FileStream("test_file.dat", FileMode.Open, FileAccess.Read, FileShare.None))
{
using (TextReader reader = new StreamReader(stream))
{
// bla bla bla does not matter
}
}
}
catch
{
// bla bla bla does not matter again
}
Thread.Sleep(500);
}
写
private bool WriteData(string data)
{
try
{
using (FileStream stream = new FileStream("test_file.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
{
stream.SetLength(0);
using (TextWriter writer = new StreamWriter(stream))
{
writer.Write(data);
}
}
return true;
}
catch
{
return false;
}
}
请注意,当文件被用于读取或写入的任何进程时,我不会向任何人授予共享权限(作者和读者都使用FileShare.None)所以基本上我正在处理异常,直到文件可用这不起作用。
【问题讨论】:
-
当你说“崩溃”时,你的意思是当你“独立”运行它时它实际上崩溃了,还是只是它显示了在调试器中抛出的异常?
-
独立运行它会崩溃“应用程序停止运行”并且我在错误日志文件崩溃之前收到的最后一条错误消息与被锁定的文件有关:
System.IO.IOException: The process cannot access the file 'long_path_of_where_the_file_was' because it is being used by another process. -
使用 ReaderWriterLock 类怎么样?
-
只有两种方法我可以看到你得到这个异常;要么你在你的catch子句中使用
throw(不确定你是否把代码留在catch里面还是它实际上是空的),或者文件在多个地方被访问所以这不是实际的代码抛出例外。现有的捕获肯定会捕获IOException。 -
只是一个愚蠢的仔细检查,它实际上不是锁定的日志文件?
标签: c# .net-4.0 concurrency filelock