System.Timers.Timer совсем не ясно, как работать - C#

Узнай цену своей работы

Формулировка задачи:

Вообщем я прочитал кучу статей, возможно не очень внимательно. Вообщем как я понимаю у System.Timers.Timer каждый тик выполняется в отдельном потоке, причем не дожидаясь конца предыдущего тика. У меня через данный таймер реализована запись в файл. Интервал 200мс. Иногда возникают случаи, когда запись не успевает выполнится за 200мс, в таких ситуациях следующий тик не может обратиться к файлу, так как он занят. Как поступить в данной ситуации подскажите?

Решение задачи: «System.Timers.Timer совсем не ясно, как работать»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.IO;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6.  
  7. namespace timurchak
  8. {
  9.     class Logger
  10.     {
  11.         private Task mTask;
  12.         private CancellationTokenSource mToken;
  13.         private string mFileName;
  14.         private ConcurrentQueue<string> mQueue;
  15.         private ManualResetEventSlim mNewEvent;
  16.  
  17.         public Logger()
  18.         {
  19.             this.mTask = null;
  20.             this.mToken = null;
  21.             this.mFileName = null;
  22.             this.mQueue = new ConcurrentQueue<string>();
  23.             this.mNewEvent = new ManualResetEventSlim(false);
  24.         }
  25.  
  26.         public void Start(string filename)
  27.         {
  28.             this.mFileName = filename;
  29.  
  30.             this.Stop();
  31.  
  32.             this.mToken = new CancellationTokenSource();
  33.             this.mTask = Task.Factory.StartNew(o => this.Process((CancellationToken)o), this.mToken.Token, this.mToken.Token);
  34.         }
  35.  
  36.         public void Stop()
  37.         {
  38.             if (this.mTask != null)
  39.             {
  40.                 try
  41.                 {
  42.                     this.mToken.Cancel();
  43.                     this.mTask.Wait();
  44.                 }
  45.                 catch (AggregateException)
  46.                 {
  47.                 }
  48.                 finally
  49.                 {
  50.                     this.mTask = null;
  51.                     this.mToken = null;
  52.                 }
  53.             }
  54.         }
  55.  
  56.         private void Process(CancellationToken token)
  57.         {
  58.             while (true)
  59.             {
  60.                 token.ThrowIfCancellationRequested();
  61.  
  62.                 this.mNewEvent.Wait(token);
  63.  
  64.                 if (this.mQueue.Count > 0)
  65.                 {
  66.                     this.mNewEvent.Reset();
  67.  
  68.                     using (StreamWriter writer = new StreamWriter(this.mFileName, true))
  69.                     {
  70.                         string message;
  71.  
  72.                         while (this.mQueue.TryDequeue(out message))
  73.                         {
  74.                             writer.WriteLine(message);
  75.                         }
  76.                     }
  77.                 }
  78.             }
  79.         }
  80.  
  81.         public void PutMessage(string message)
  82.         {
  83.             this.mQueue.Enqueue(message);
  84.             this.mNewEvent.Set();
  85.         }
  86.     }
  87. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы