当我执行下面的代码时,我得到了常见的异常The process cannot access the file *filePath* because it is being used by another process
。
允许此线程等到可以安全访问此文件的最有效方法是什么?
假设:
:
using (var fs = File.Open(filePath, FileMode.Append)) //Exception here
{
using (var sw = new StreamWriter(fs))
{
sw.WriteLine(text);
}
}
到目前为止,我提出的最好的是以下内容。这样做有什么缺点吗?
private static void WriteToFile(string filePath, string text, int retries)
{
const int maxRetries = 10;
try
{
using (var fs = File.Open(filePath, FileMode.Append))
{
using (var sw = new StreamWriter(fs))
{
sw.WriteLine(text);
}
}
}
catch (IOException)
{
if (retries < maxRetries)
{
Thread.Sleep(1);
WriteToFile(filePath, text, retries + 1);
}
else
{
throw new Exception("Max retries reached.");
}
}
}
答案 0 :(得分:3)
如果您有多个线程尝试访问同一文件,请考虑使用锁定机制。最简单的形式可能是:
lock(someSharedObject)
{
using (var fs = File.Open(filePath, FileMode.Append)) //Exception here
{
using (var sw = new StreamWriter(fs))
{
sw.WriteLine(text);
}
}
}
作为替代方案,请考虑:
File.AppendText(text);
答案 1 :(得分:2)