Как я могу открыть Программу с лог-файлом несколько раз?(С #) - PullRequest
0 голосов
/ 01 октября 2018

У меня есть этот код:

class Program
{
    static void Main(string[] args)
    {
        using (StreamWriter w = File.AppendText(@"C:\temp\log.txt"))
        {
            Log("Test1", w);
            Console.ReadLine();
        }
    }
    public static void Log(string logMessage, TextWriter w)
    {
        w.WriteLine(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString());
        w.WriteLine(logMessage);
        w.WriteLine("-----------------------------------------------------------------------");
    }
}

, когда я запускаю этот код дважды одновременно, я получаю исключение, потому что файл уже открыт в другом экземпляре.

Isесть ли альтернатива StreamWriter, которая может записать один и тот же файл из двух экземпляров?

1 Ответ

0 голосов
/ 01 октября 2018

На самом деле StramWriter необходимо закрыть обработчик файла после записи в него чего-либо.Таким образом, поместив оператор Используя , вы передали эту задачу (Закрытие обработчика файла) Using (это одно из преимуществ), так что если вы по какой-либо причине ждете в блоке Using (вы добавилиa Console.ReadLine ()) Обработчик файла будет открываться до конца этого блока.

, если верны вышеуказанные коды:

class Program
{
     static void Main(string[] args)
     {
         using (StreamWriter w = File.AppendText(@"C:\temp\log.txt"))
         {
             Log("Test1", w);
         }
         Console.ReadLine();
     }

     public static void Log(string logMessage, TextWriter w)
     {
         w.WriteLine(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString());
         w.WriteLine(logMessage);
         w.WriteLine("-----------------------------------------------------------------------");
     }
 }

должна быть небольшая вероятность параллелизма.но это может произойти, и вы можете использовать команду try catch и оператор while , чтобы убедиться, что ваш журнал был отправлен.

class Program
{
     static void Main(string[] args)
     {
         bool WriteDone = false;
         while(!WriteDone)
         {
             try 
             {
                 using (StreamWriter w = File.AppendText(@"C:\temp\log.txt"))
                 {
                    Log("Test1", w);
                 }
                 WriteDone = true;
              } 
              catch 
              { 
                   System.Threading.Thread.Sleep(1000); // Wait for 1s and try again
              }
         }
         Console.ReadLine();
     }

     public static void Log(string logMessage, TextWriter w)
     {
         w.WriteLine(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString());
         w.WriteLine(logMessage);
         w.WriteLine("-----------------------------------------------------------------------");
     }
 }
...