2015-05-28 58 views
0

我正在用C#编写视频播放器(视频工作正常),现在我需要的是获取libvlc日志以及我的自定义日志,以便将它们打印到文件中。为什么在这种情况下我有IOException?

我用NLOG它处理libvlc日志(与nVLC)和我提出一个事件为我的自定义日志,并在buth情况下,这种功能被称为:

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块中通常不会有用)...这会导致我的应用崩溃。有谁知道它为什么这样做?

+0

启动应用程序时文件是否已经在文件夹中,或者当应用程序运行时是否将它们插入到文件夹中? – invidicult

+2

有多少个线程访问这个方法?你为什么要重新发明轮子,而不是使用类似log4net的东西? – CodeCaster

+0

“tracerlogs”可能是从多个线程调用的? –

回答

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();。这工作得很好!感谢那些告诉我必须使用线程才能看到的人。

相关问题