代码的目的,为了高效的输出日志, 新开线程500ms检查一次有没有新log 有的话会 输出到界面 提高效率。
先贴一下代码 记录一下
不停调用PrintLogDBUG 。发现 执行到 PrintLogDBUG 的lock (LockLog)会阻塞 不再继续整个程序就死掉了
记录
1.首先一直在等待lock解锁肯定别的地方占用,但是整个代码只有log_copy下会lock这个LockLog对象
2.接下来屏蔽掉 fuction log_copy的lock下所有代码发现程序执行正常
3.问题出在log_copy的lock下。某段代码会导致这个lock不退出 下个lock一直会等待
4.反复调试 缩小范围发现屏蔽 log_copy下的Invoke 代码 执行正常
5.初步断定Invoke 导致的问题。(为什么Invoke 会导致这样的问题? 有待查阅资料 记录)
6.最后修改log_copy代码如FUCTION2 暂时解决了这个问题
private List<string> Mylogs = new List<string>();
private readonly object LockLog = new object();
static void Main()
{
InitLogWin();
while(true)
{
PrintLogDBUG("1","test");
Thread.Sleep(10);
}
}
/*fuction1*/
private void PrintLogDBUG(string id, string logs)
{
Console.WriteLine("日志");
if (Mylogs != null)
{
string datashow = DateTime.Now.ToString() + ":" + logs;
string to_show = id + "^" + datashow;
lock (LockLog){
Mylogs.Add(to_show);
}
}
Console.WriteLine("日志退出");
}
private void InitLogWin()
{
Thread thlog = new Thread(new ThreadStart(log_copy));
thlog.SetApartmentState(ApartmentState.MTA);
thlog.IsBackground = true;
thlog.Start();
}
private void log_copy()
{
while (true)
{
Thread.Sleep(500);
Console.WriteLine("dbug1");
lock (LockLog)
{
Console.WriteLine("dbug2");
if (Mylogs.Count != 0)
{
Console.WriteLine("dbug3");
Invoke(new MethodInvoker(delegate ()
{
if (log_window.Items.Count > 500)
{
log_window.Items.Clear();
}
log_window.Items.AddRange(Mylogs.ToArray());
log_window.SelectedIndex = log_window.Items.Count - 1;
log_window.SelectedIndex = -1;
}));
Console.WriteLine("dbug4");
string tosave = "";
for (int i = 0; i < Mylogs.Count; i++)
{
tosave += Mylogs[i].ToString() + "\r\n";
}
Console.WriteLine("5");
string path = System.DateTime.Now.Year.ToString().PadLeft(2, '0') + System.DateTime.Now.Month.ToString().PadLeft(2, '0')
+ System.DateTime.Now.Day.ToString().PadLeft(2, '0');
if (path != "")
{
LogSave(System.Environment.CurrentDirectory + "\\games\\" + path + "运行日志.txt", tosave);
}
else
{
}
Console.WriteLine("dbug6");
Mylogs.Clear();
}
}
Console.WriteLine("dbug exit");
}
}
/*FUCTION2*/
private void log_copy()
{
List<string> templogs = new List<string>();
while (true)
{
Thread.Sleep(500);
Console.WriteLine("dbug1");
if (Mylogs.Count != 0)
{
templogs.Clear();
lock (LockLog)
{
templogs.AddRange(Mylogs);
Mylogs.Clear();
}
Console.WriteLine("dbug3");
Invoke(new MethodInvoker(delegate ()
{
if (log_window.Items.Count > 500)
{
log_window.Items.Clear();
}
log_window.Items.AddRange(templogs.ToArray());
log_window.SelectedIndex = log_window.Items.Count - 1;
log_window.SelectedIndex = -1;
}));
Console.WriteLine("dbug4");
string tosave = "";
for (int i = 0; i < templogs.Count; i++)
{
tosave += templogs[i].ToString() + "\r\n";
}
Console.WriteLine("dbug5");
string path = System.DateTime.Now.Year.ToString().PadLeft(2, '0') + System.DateTime.Now.Month.ToString().PadLeft(2, '0')+ System.DateTime.Now.Day.ToString().PadLeft(2, '0');
if (path != "")
{
LogSave(System.Environment.CurrentDirectory + "\\games\\" + path + "运行日志.txt", tosave);
}
else
{
}
Console.WriteLine("dbug6");
}
Console.WriteLine("dbug1 exit");
}
}