最近写了个程序,需要记录日志,方法是把需要记录的信息放到一个队列里,开个线程去队列里取信息,写到本地文件;
当主程序关闭时,写日志线程也关闭,程序正常退出。
在debug过程中,发现当关闭程序时,队列里其实堆积了很多条记录还没有写到本地文件, 如果这时直接queue.clear(),将会导致日志信息丢失;
所以在写日志线程关闭前,加个循环 while(queue.count > 0) {},这样可以保证日志信息写完再退出程序。
但其实这治标不治本,重点是为什么写的较慢?
后来发现了三个地方可以改进的:
1 while (StartEvent.WaitOne(10) == true) //阻塞线程10毫秒;
{
WriteLog(); // 写日志方法;
}
其实阻塞10毫秒都有点长了,可以更短一些;
2 WriteLog()
{
string msg = MsgQueue.Dequeue();
var logStreamWriter = new StreamWriter(fileName, true);
logStreamWriter.WriteLine(msg );
logStreamWriter.Close();
}
线程好不容易获得了一次时间片,结果只写了一条记录,太浪费了;
所以在写日志方法里,加个循环,执行个20次,保证充分利用时间片;
3 在写日志方法里,每写一条记录就new一个streamwriter,打开文件,写好再关闭文件,文件较小还可以,若文件比较大,耗时就会比较多了
所以改成打开一次文件,执行20次也就是写20条记录再关闭,效果会更好。
20140626 修改:
“其实阻塞10毫秒都有点长了,可以更短一些;”,这句话是有误的!!
StartEvent.WaitOne(10) 的意思是:
该线程在间隔多长时间后从主线程接收消息,比如主线程关闭了,但该线程要等到 10 ms后才会接收。
举两个例子:
startevent.waitone(10000): 点击了关闭程序,但10s后才会关闭;
startevent.waitone(-1): 无限期间隔时间,也就意味着该线程将不会被关闭。