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

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

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

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

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

textual
Листинг программы
using System;
using System.Collections.Concurrent;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
 
namespace timurchak
{
    class Logger
    {
        private Task mTask;
        private CancellationTokenSource mToken;
        private string mFileName;
        private ConcurrentQueue<string> mQueue;
        private ManualResetEventSlim mNewEvent;
 
        public Logger()
        {
            this.mTask = null;
            this.mToken = null;
            this.mFileName = null;
            this.mQueue = new ConcurrentQueue<string>();
            this.mNewEvent = new ManualResetEventSlim(false);
        }
 
        public void Start(string filename)
        {
            this.mFileName = filename;
 
            this.Stop();
 
            this.mToken = new CancellationTokenSource();
            this.mTask = Task.Factory.StartNew(o => this.Process((CancellationToken)o), this.mToken.Token, this.mToken.Token);
        }
 
        public void Stop()
        {
            if (this.mTask != null)
            {
                try
                {
                    this.mToken.Cancel();
                    this.mTask.Wait();
                }
                catch (AggregateException)
                {
                }
                finally
                {
                    this.mTask = null;
                    this.mToken = null;
                }
            }
        }
 
        private void Process(CancellationToken token)
        {
            while (true)
            {
                token.ThrowIfCancellationRequested();
 
                this.mNewEvent.Wait(token);
 
                if (this.mQueue.Count > 0)
                {
                    this.mNewEvent.Reset();
 
                    using (StreamWriter writer = new StreamWriter(this.mFileName, true))
                    {
                        string message;
 
                        while (this.mQueue.TryDequeue(out message))
                        {
                            writer.WriteLine(message);
                        }
                    }
                }
            }
        }
 
        public void PutMessage(string message)
        {
            this.mQueue.Enqueue(message);
            this.mNewEvent.Set();
        }
    }
}

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


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

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

12   голосов , оценка 4.083 из 5
Похожие ответы