Моя программа должна часто писать сообщения нескольким файлам. Поскольку это очень много времени, мне нужно его оптимизировать. Ниже вы можете найти извлечение из моей программы, где я пытаюсь записать async в файл в фоновом режиме. Кажется, что это работает, но я не уверен, что это лучшая практика, поскольку я не распоряжаюсь задачами (эта часть прокомментирована). Я не делаю этого, потому что не хочу, чтобы моя программа дождалась завершения этих задач. Просто я хочу, чтобы мое сообщение было написано на несколько файлов в фоновом режиме как можно быстрее. Поскольку к этим файлам можно было обращаться несколькими потоками, я добавил блокировку. Я использую статические методы, потому что эти методы используются везде в моем коде, и я не хочу создавать экземпляр этого класса, просто чтобы написать одну строку сообщения в файл везде (возможно, это неправильно).Как оптимизировать запись в несколько файлов в фоновом режиме
================= Класс =========================================================== ===================
namespace test
{
public static class MessageLOG
{
private static string debugFileName = Settings.DebugLOGfilename;
private static string logFileName = Settings.LOGfilename;
private static object DebuglockOn = new object();
private static object LoglockOn = new object();
private static StreamWriter DebugSW;
private static StreamWriter LogSW;
private static void DebugFile(string message)
{
uint linesCount = 0;
string _filename = debugFileName;
if(DebugSW == null && !string.IsNullOrEmpty(_filename))
DebugSW = new StreamWriter(_filename);
if(DebugSW != null)
{
lock(DebuglockOn)
{
DebugSW.WriteLine(message);
linesCount++;
if (linesCount > 10)
{
DebugSW.Flush();
linesCount = 0;
}
}
}
}
private static void LogFile(string message)
{
uint linesCount = 0;
string _filename = logFileName;
if(LogSW == null && !string.IsNullOrEmpty(_filename))
LogSW = new StreamWriter(_filename);
if(LogSW != null)
{
lock(LoglockOn)
{
LogSW.WriteLine(string.Format("{0} ({1}): {2}", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString(), message));
linesCount++;
if (linesCount > 10)
{
LogSW.Flush();
linesCount = 0;
}
}
}
public static void LogUpdate(string message)
{
ThreadPool.QueueUserWorkItem(new WaitCallback((x) => LogFile(message)));
ThreadPool.QueueUserWorkItem(new WaitCallback((x) => DebugFile(message)));
ThreadPool.QueueUserWorkItem(new WaitCallback((x) => Debug.WriteLine(message)));
}
//This method will be called when the main thread is being closed
public static void CloseAllStreams()
{
if (DebugSW != null)
{
DebugSW.Flush();
DebugSW.Close();
}
if (LogSW != null)
{
LogSW.Flush();
LogSW.Close();
}
}
=============== main window ===========
void MainWIndow()
{
... some code ....
MessageLog.LogUpdate("Message text");
... code cont ....
MessageLog.CloseAllStreams();
}
Может быть, немного оффтопик, и вы не отвечаете на свой вопрос, но вы понимаете, что есть много хороших и бесплатных фреймворков loggin? –
Я только что начал свое путешествие с C#, но я использовал коды программ 15 лет назад. Теперь я борюсь с новыми событиями, такими как async, многопоточность, WPF. Я не знаю других фреймворков. Можете ли вы предложить, пожалуйста? – Zibi
log4net - отличная структура ведения журнала.Вы можете вытащить его через менеджер пакетов Nuget в VS. – Tom