Написать в текстовом файле из двух потоков - PullRequest
0 голосов
/ 04 мая 2019

Я использую процедуру для ловли любых исключений внутри моего проекта. Тогда я пишу это в текстовом файле. Но как я могу предотвратить исключение, если я попытаюсь записать в текстовый файл два разных потока?

public static void LogFile(string ex)
    {
        try
        {
            string strPath = @"C:\Log.txt";
            if (!File.Exists(strPath))
                File.Create(strPath).Dispose();

            using (StreamWriter sw = File.AppendText(strPath))
            {
                // sw.WriteLine("=============Error Logging ===========");
                sw.WriteLine("===========Start============= " + DateTime.Now);
                sw.WriteLine("Error Message: " + ex);
                //sw.WriteLine("Stack Trace: " + ex.StackTrace);
                sw.WriteLine("===========End============= " + DateTime.Now);
                sw.WriteLine();

            }
        }
        catch
        {

        }
    }

Когда два потока одновременно пытаются записать в мой файл LogFile.txet, я получаю исключение, что используется * txt файл.

1 Ответ

2 голосов
/ 04 мая 2019

вам нужно синхронизировать ваш блок, например, как в коде ниже.Здесь есть и другие примеры: C # версия синхронизированного ключевого слова java?

Кстати, есть вещи, которые не считаются хорошими практиками, например игнорирование исключения.Вы могли бы также рассмотреть возможность использования библиотеки журналов, которая может позаботиться о многопоточности, производительности и тому подобном ...

static object Lock = new object();




public static void LogFile(string ex)
    {
lock (Lock) {
        try
        {
            string strPath = @"C:\Log.txt";
            if (!File.Exists(strPath))
                File.Create(strPath).Dispose();

            using (StreamWriter sw = File.AppendText(strPath))
            {
                // sw.WriteLine("=============Error Logging ===========");
                sw.WriteLine("===========Start============= " + DateTime.Now);
                sw.WriteLine("Error Message: " + ex);
                //sw.WriteLine("Stack Trace: " + ex.StackTrace);
                sw.WriteLine("===========End============= " + DateTime.Now);
                sw.WriteLine();

            }
        }
        catch
        {

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...