该进程无法访问该文件 'abc.log',因为它正被使用 另一个过程。
嗨,我已经从我的应用程序中看到了这个异常,但我仍在努力解决这个问题,希望我能从stackoverflow中获得一些见解。
在我的应用程序中,我已经定义了一个写入日志文件的WriteToLog函数。 我的应用程序的mainForm也将启动backgroundWorker做一些也调用WriteToLog的工作。也许两个线程访问文件会导致问题?但在我的代码中 我已经尽力写了flush并关闭了文本文件(我想),这是我的WriteToLog代码:
StreamWriter sw = null;
string newText = "";
try
{
//populate the content for newText
sw = File.AppendText(LOG_FILE);
sw.Write(newText);
sw.Flush();
sw.Close();
}
catch (IOException ex)
{
MessageBox.Show("Failed to write to log!\n\t" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
if (sw != null)
{
sw.Close();
}
}
我认为只要我刷新并关闭streamWriter,我应该能够多次调用WriteToLog并且在多线程中不是吗?或者如果我错了,我可以简单地将文件打开共享,还是有其他原因/解决方案?
答案 0 :(得分:1)
没有;尝试同时打开文件的不同线程会相互干扰。您可以lock
共享object
来强制线程一次运行一个。
或者只使用内置的.NET tracing functionality;您可以将app.config
配置为写入文件。
答案 1 :(得分:1)
这可能与您的问题无关,但您可以通过using
语句与StreamWriter
使用finally
语句而不是Close
来简化此代码。这样做还有一个额外的好处,就是不必显式调用Flush
或string newText = "";
try
{
//populate the content for newText
using (StreamWriter sw = File.AppendText(LOG_FILE))
{
sw.Write(newText);
}
}
catch (IOException ex)
{
MessageBox.Show("Failed to write to log!\n\t" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
(关闭流也会刷新它)。
我没有尝试过编译,但它应该是这样的:
{{1}}
答案 2 :(得分:0)
如果从多个线程调用此方法,则必须确保文件操作是原子操作。线程A很可能越过AppendText并停止,例如在写入时,此时线程B被调度并开始写入相同(现在已锁定)的文件。
解决此问题的一种方法是在代码示例中显示的语句周围放置lock区域。