我正在使用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
块中没有用)...这会让我的应用程序崩溃。有谁知道为什么会这样做?
答案 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();
。这很好用!感谢那些告诉我必须通过线程查看的人。