Files

61 lines
1.5 KiB
C#

using System;
using System.ComponentModel;
using System.Threading;
namespace Quobject.EngineIoClientDotNet.Thread
{
public class TriggeredLoopTimer
{
private ManualResetEvent trigger;
private CancellationTokenSource ts;
private TriggeredLoopTimer()
{
trigger = new ManualResetEvent(false);
ts = new CancellationTokenSource();
}
public static TriggeredLoopTimer Start (Action method, int delayInMilliseconds)
{
TriggeredLoopTimer ping = new TriggeredLoopTimer();
ping.Run (method, delayInMilliseconds);
return ping;
}
public void Trigger()
{
trigger.Set();
}
private void Run (Action method, int delayInMilliseconds)
{
var worker = new BackgroundWorker();
worker.DoWork += (s, e) =>
{
while (!ts.IsCancellationRequested)
{
System.Threading.Thread.Sleep (delayInMilliseconds);
if (!ts.IsCancellationRequested)
{
method();
trigger.WaitOne();
trigger.Reset();
}
}
};
worker.RunWorkerAsync();
}
public void Stop()
{
if (ts != null)
{
ts.Cancel();
trigger.Set();
}
}
}
}