2008-11-17 2 views
2

Следующий код является только упрощенный пример, чтобы продемонстрировать мою проблему:Открыть файл для совместного написания

using System; 
using System.IO; 
using System.Diagnostics; 
using System.Threading; 

namespace ConsoleApplication5 
{ 
    class Program 
    { 
     static string LogFile = @"C:\test.log"; 

     static void Main(string[] args) 
     { 
      for (int i = 0;i<10;i++) 
      { 
       new Thread(new ParameterizedThreadStart(DoWork)).Start(i); 
      } 
      Console.ReadKey(); 
     } 

     static void DoWork(object param) 
     { 
      int count = (int)param; 

      try 
      { 
       using (FileStream fs = new FileStream(LogFile, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)) 
       using (StreamWriter sw = new StreamWriter(fs)) 
       { 
        sw.WriteLine(DateTime.Now + " - Start " + count.ToString()); 
        Thread.Sleep(2000); // simulate doing some work 
        sw.WriteLine(DateTime.Now + " - End " + count.ToString()); 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(count.ToString() + ": " + e.Message); 
       return; 
      } 
      Console.WriteLine(count.ToString() + ": Done."); 
     } 
    } 
} 

Проблема здесь состоит в том, что, как правило, только одна запись делает его в файл, даже если я вызываю метод 10 раз. Файл должен быть открыт, чтобы разрешить совместное использование. Насколько я могу судить, исключения не выбрасываются. Что происходит?

В реальном коде, что этот пример теней, каждый вызов DoWork фактически выполняется в отдельном процессе, хотя тестирование показывает, что результаты одинаковы - если я могу исправить его здесь, я могу исправить его там.

ответ

4

Здесь нет ничего странного. Представьте, что у вас есть файл «a.txt», и вы открываете его в блокноте 10 раз. После этого вы изменяете содержимое файла и сохраняете его в каждом экземпляре блокнота. Естественно, последнее сохранение, которое вы делаете, - это тот, который сохраняется в файле, потому что он перезаписывает предыдущие 9 сейвов.

Я думаю, что у вас такое же поведение. Все файлы открываются одновременно, потому что у вас есть Thread.Sleep в каждой обработке. Таким образом, i-файл, который нужно сохранить, перезаписывает предыдущее сохранение (i-1).

EDIT: попробуйте удалить Thread.Sleep (2000), и у вас будет больше журналов в файле.

+0

Конечно, это не странно :) Я просто пытался рассмотреть, какая не странная вещь продолжалась. Это имеет смысл, спасибо. – 2008-11-17 18:07:43

1

Используйте SyncLock, который гарантирует, что только один поток откроет файл за раз. В то же время другие процессы не сбой, а ожидание в queue.

Смежные вопросы