C#logger不写所有行

时间:2017-03-27 09:21:48

标签: c# file locking append

我有一个记录器,每秒必须多次写入信息:

    long iii = 0;
    while (true)
        Logger.WriteLog("=====> " + iii++);

记录器基本上只是写入文件

public static bool WriteLog(string newLines)
{
    string txtLines = string.Empty;
    strError = string.Empty;
    ...
    lock (thisLock)
    {
        string strDateTime = "[" + DateTime.Now.ToString() + "." + DateTime.Now.ToString("fff") + strDelta + "] ";
        newLines = strDateTime + newLines;
        newLines = newLines.Replace(Environment.NewLine, Environment.NewLine + strDateTime);
        lastLogTime = DateTime.Now;
        ...
        File.AppendAllText(_fileName, newLines);
        return true;
    }           
}

}

所以我期望的是越来越多的连续数字,如1,2,3,4,5等。

而不是我得到的是:

  

[27/03/2017 11:09:25.540 - START] =====> 0

     

[27/03/2017 11:09:25.541 - 00:00:00.001] =====> 1

     

[27/03/2017 11:09:25.542 - 00:00:00.001] =====> 2

     

[27/03/2017 11:09:25.556 - 00:00:00.014] =====> 4

     

[27/03/2017 11:09:25.557 - 00:00:00.001] =====> 5

     

[27/03/2017 11:09:25.582 - 00:00:00.025] =====> 7

     

[27/03/2017 11:09:25.592 - 00:00:00.010] =====> 9

很清楚我做错了什么。 从here我得到的附加文本应该自己完成:write,flush,close。

那说我还有其他奇怪的事情发生。 如果我在调试模式下启动示例并将其最小化,我得到以下错误,调试器显示如下图:

托管调试助手' ContextSwitchDeadlock'已在C:\ Temp \ WpfApplication1 \ WpfApplication1 \ bin \ Debug \ WpfApplication1.vshost.exe'中检测到问题。

附加信息:CLR无法从COM上下文0x4236c0过渡到COM上下文0x423830,持续60秒。拥有目标上下文/公寓的线程很可能是在非抽空等待或处理非常长时间运行的操作而不抽取Windows消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随时间不断累积。为了避免这个问题,所有单线程单元(STA)线程都应该使用抽取等待原语(例如CoWaitForMultipleHandles)并在长时间运行操作期间定期泵送消息。

enter image description here

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

好的我有一个类似的问题,并通过在AppendText之后放置一个非常小的暂停来解决。无论做什么都会做System.Threading.Sleep(1); 至于另一个问题,正如Mrinal Kamboj所说,你可能会试图取消锁定。

答案 1 :(得分:0)

在调试包含for / next循环的BackGroundWorker线程时,我遇到了类似的问题,该循环写出调试数据-数据在一行的中间被截断,而在文件末尾缺少以下几行。在循环修复后关闭File.AppendText。