为什么在这种情况下我有IOException?

时间:2015-05-28 09:50:50

标签: c# logging nlog ioexception

我正在使用C#编写视频播放器(视频工作正常),我现在需要的是获取libvlc日志以及我的自定义日志以将其打印在文件中。

我使用NLog处理libvlc日志(使用nVLC),我为自定义日志引发了一个事件,但在这种情况下,这个函数被调用:

private static void tracerlogs(string erreur, VLCControl.ControleUtilisateurVLC.LogLevels LvLog)
{
   string path = "logs.txt";//Sera redéfini dans l'appli
   if (!File.Exists(path))
   {
       // Create a file to write to.
       using (StreamWriter sw = File.CreateText(path))
       {
           sw.WriteLine(erreur + " " + LvLog.ToString());
           sw.Close();
       }
   }
   else
   {
       using (StreamWriter sw = File.AppendText(path))
       {
           sw.WriteLine(erreur + " " + LvLog.ToString());
           sw.Close();
       }
   }
   Console.WriteLine(erreur + " " + LvLog.ToString());
}

问题在于我随机收到一个System.IO.IOException,告诉“进程无法访问该文件,因为它正被另一个进程使用”。虽然我关闭了我的StreamWriter(通常在using块中没有用)...这会让我的应用程序崩溃。有谁知道为什么会这样做?

1 个答案:

答案 0 :(得分:0)

我最终通过添加资源解决了这个问题:因为尝试访问此函数的不同线程之间存在冲突,我将其包装:

    private static void tracerlogs(string erreur, VLCControl.ControleUtilisateurVLC.LogLevels LvLog)
    {
        lock (LockLog) {
        string path = "logs.txt";//Sera redéfini dans l'appli
        if (!File.Exists(path))
        {
            // Create a file to write to.
            using (StreamWriter sw = File.CreateText(path))
            {
                sw.WriteLine(erreur + " " + LvLog.ToString());
                sw.Close();
            }
        }
        else
        {
            using (StreamWriter sw = File.AppendText(path))
            {
                sw.WriteLine(erreur + " " + LvLog.ToString());
                sw.Close();
            }
        }
        Console.WriteLine(erreur + " " + LvLog.ToString());
        }
    }

我在课堂上宣布public static readonly object LockLog = new Object();。这很好用!感谢那些告诉我必须通过线程查看的人。

相关问题