Предыдущий метод все еще записывает данные в текстовый файл, пока новый экземпляр метода работает на C # - PullRequest
1 голос
/ 17 декабря 2011

В настоящее время я столкнулся с проблемой, у меня есть метод, который я запускаю, который запрашивает определенные порты сервера и записывает результаты в текстовый файл с именем temp.txt.В Temp.txt никогда не должно быть дубликатов данных - файл должен быть очищен до начала метода, хотя иногда я обнаруживаю, что предыдущий экземпляр метода все еще работает (как его асинхронный), и я часто получаю дублирующиеся данные, так как другой методвсе еще пишет в файл / выполняет запросы.

Фрагмент кода:

            StreamWriter sw = File.AppendText("temp");
            sw.WriteLine("Check1=Success");
            sw.Close();

Ответы [ 3 ]

2 голосов
/ 17 декабря 2011

Я бы предпочел изменить подход.Используйте очередь, чтобы записать, что вам нужно обновить файл.Может быть MSMQ или очередь памяти, в зависимости от того, какой уровень отказоустойчивости вы хотите иметь.Тогда у будет один поток для удаления из очереди и обновления файла , при этом вы гарантируете единичные обновления.Это своего рода реализация шаблона публикации-подписки со многими издателями и одним подписчиком.В качестве альтернативы вы можете заблокировать доступ к файлу, используя lock() поверх статического объекта.

2 голосов
/ 17 декабря 2011

Вы можете реализовать своего рода блокировку

Блокировка гарантирует, что один поток не войдет в критическую секцию код, пока другой поток находится в критическом разделе. Если другой поток пытается ввести заблокированный код, он будет ждать, блокировать, пока объект освобожден.

  class OnlyOneCallerAllowed
    {     
       private static readonly object locker = new object();        
        public static void OnlyOneMethodCanWrite()
        {
           lock (locker)
            {
             using(StreamWriter sw = File.AppendText("temp"))
             {
               sw.WriteLine("Check1=Success");
             }

         }
     }
0 голосов
/ 17 декабря 2011
StreamWriter sw = File.AppendText("temp");
sw.WriteLine("Check1=Success");
sw.Flush(); // <======
sw.Close(); 

РЕДАКТИРОВАТЬ :

А как насчет открытия файла с эксклюзивным доступом (FileShare.None)?

FileStream fs = new FileStream("temp", FileMode.Append, FileAccess.Write, FileShare.None);
StreamWriter sw = new StreamWriter(fs);

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

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