2016-11-04 54 views
1

目前我正在爲c#應用程序開發日誌記錄到SQL服務器表中。c#中的異步火災和遺忘#

我有一個叫做Logger的指定類,它有一個靜態方法writeToLog()

我只想調用該靜態函數而不阻塞調用線程。

這怎麼可能在C#中乾淨而快速?

函數不返回任何他們只是開火,忘記。

謝謝你的忠告

+1

Task.Run(writeToLog); – Steve

+5

不要重新發明輪子,有大量的免費日誌庫已經解決了您要運行的所有問題。例如,Log4Net可以[直接寫入Sql服務器作爲日誌的目的地](https://logging.apache.org/log4net/log4net-1.2.13/release/sdk/log4net.Appender.AdoNetAppender.html)。 –

+5

除非您正在後臺工作線程上處理日誌記錄,否則不應該「激發並忘記日誌記錄」。如果你「開火併忘記」它,它可能會改變順序,而你不想那樣做。 –

回答

0

還有就是serveral的可用的日誌記錄庫,在那裏花了有關性能的一些想法的機會。

如果你仍然需要自己開發一個輕量級的解決方案,我想兩種方法。

1)創建一個運行日誌功能Task,無需等待他們

2)的對數的方法保存在寫入到SQL數據庫與後臺線程隊列日誌信息。

我會推薦第二種方式,因爲日誌記錄本身可以在同步函數調用中完成,而無需創建任務。

此方法的另一個參數是可以保證日誌消息的順序。通過爲每個單個消息使用任務,執行順序未定義。

最後一個參數:將消息塊寫入SQL表可能更有效。通過使用隊列,您將能夠在批量操作中寫入消息。

+0

強制應用程序始終擁有專用的日誌記錄線程很可能會比創建一些Task對象和利用線程池的開銷高得多。創建一個新的'Task'基本上沒有任何成本,即使你將它乘以幾千個實例,啓動一個新的'Thread',並迫使它在整個應用程序的生命週期中保持活動狀態,都是相當昂貴的。 – Servy

+0

@Servy - 感謝您的提示;我添加了更多的參數。 –

+0

@Servy我不同意這一點。我認爲處理日誌的單個線程可以比多個同時運行的任務更有效率。也可以批量處理多個日誌記錄操作。保持日誌時出錯,可以同步處理。 –