文件正由另一个进程使用。理由和解决方案?

时间:2010-05-18 22:51:26

标签: c#

  

该进程无法访问该文件   '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并且在多线程中不是吗?或者如果我错了,我可以简单地将文件打开共享,还是有其他原因/解决方案?

3 个答案:

答案 0 :(得分:1)

没有;尝试同时打开文件的不同线程会相互干扰。您可以lock共享object来强制线程一次运行一个。

或者只使用内置的.NET tracing functionality;您可以将app.config配置为写入文件。

答案 1 :(得分:1)

这可能与您的问题无关,但您可以通过using语句与StreamWriter使用finally语句而不是Close来简化此代码。这样做还有一个额外的好处,就是不必显式调用Flushstring 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区域。