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();
}
}
}