2017-03-27 25 views
0

我有一個具有每秒寫入信息數次記錄:C#記錄不寫都行

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我得到的附加文本應該自己做:寫,刷新,關閉。

這就是說我還有其他奇怪的事情發生。 如果我在調試模式下啓動的例子,並儘量減少它,我得到展示調試器下面的錯誤如下圖:

託管調試助手「ContextSwitchDeadlock」已檢測到「C的一個問題:\ TEMP \ WpfApplication1 \ WpfApplication1 \ BIN \調試\ WpfApplication1.vshost.exe」。

附加信息:CLR無法從COM上下文0x4236c0轉換到COM上下文0x423830 60秒。擁有目的地上下文/公寓的線程很可能要麼進行非抽水等待,要麼處理非常長的運行操作而不抽取Windows消息。這種情況通常會對性能產生負面影響,甚至可能導致應用程序無法響應或內存使用量不斷累積。爲了避免這個問題,所有的單線程單元(STA)線程都應該使用抽取等待原語(比如CoWaitForMultipleHandles),並在長時間運行的操作中定期抽取消息。

enter image description here

感謝幫助。

+1

爲什麼不使用log4net等日誌框架?你不必自己做這件事。這個框架將爲你處理所有事情,併發訪問。 –

+0

這可能是一個解決方案,但可惜我把我的例程數十億的電話,所以我想使用我的例程.... – Luca

+0

如果您使用多個線程,你是否確保只有一個線程可以更新序列號? –

回答

1

OK我也有類似的問題,通過把一個非常小的停頓後AppendText通過解決最簡單的記錄之一。無論什麼將甚至System.Threading.Sleep(1); 至於另一個問題,正如Mrinal Kamboj說你可能試着去掉鎖。

0

在您提供的有限代碼中,我可以看到多個地雷,它們可能會出現可怕的錯誤,從而導致嚴重的問題,以 - lock (thisLock)開頭。 什麼樣的變量是thisLock,它是一個private/public/internal,這有可能讓很多呼叫等待登錄,特別是如果鎖內的代碼長時間運行並且這是ContextSwitchDeadlock警告的最可能原因,請檢查以下鏈接瞭解更多詳情:

.NET - ContextSwitchDeadlock was detected

詳見鏈接,即使一切都在你的代碼正確,且禁用上述警告,它仍然有離開的UI用戶與恐怖和死亡UI的範圍經驗。

我的建議是使用CommonLogger,其包裝都Log4NetNLog,不只是它是內部線程安全的,但我會建議NLog,這很容易建立異步做記錄,這將意味着用戶界面將永遠不會被阻止,所有的日誌都會在後臺發生。在上面的鏈接中建議的BackgroundWorker是一種較舊的方式。事實上,所有的異步設置都是基於配置的,因此您需要在代碼中執行的所有操作都將由NLog API取代所有當前調用,這很簡單,因爲它們也將對象作爲方法參數,可用於消息字符串,請NLog Wiki,這是貫徹落實