public Task QueueLowImportanceRestartableWork(Func<System.Threading.CancellationToken, Task> work)
{
bool needsToStartTaskQueue = false;
TaskCompletionSource<bool> completionSource = new TaskCompletionSource<bool>();
lock (_lowImportanceRestartableWork)
{
_lowImportanceRestartableWork.Enqueue(Tuple.Create(completionSource, work));
if (_lowImportanceRestartableWork.Count == 1 || !_taskQueueRunning)
{
needsToStartTaskQueue = true;
_taskQueueRunning = true;
}
}
if (needsToStartTaskQueue)
{
Task.Factory.StartNew(RunWorkQueue, _cancelationTokenSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
return completionSource.Task;
}
CancellationTokenSource _cancelationTokenSource = new CancellationTokenSource();