private void Loop()
{
_cancelTokenSource = new CancellationTokenSource();
_running = true;
Task.Factory.StartNew(async () =>
{
while (_running)
{
if (_cancelTokenSource.IsCancellationRequested)
break;
int delay = DoIterate();
await Task.Delay(delay);
}
}, _cancelTokenSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}