public void Cancel(ICanExecute jobToCancel) { var watch = System.Diagnostics.Stopwatch.StartNew(); var waitTasks = new List<Task>(); lock (executingTasks) { foreach (var execInstance in this.executingTasks) { if (execInstance.Instance == jobToCancel) { waitTasks.Add(execInstance.Task); execInstance.CancelSource.Cancel(); } } } try { Task.WaitAll(waitTasks.ToArray()); } catch { } watch.Stop(); Console.WriteLine("Waited {1:N1}ms for job {0} to stop from cancel", jobToCancel.Name, watch.Elapsed.TotalMilliseconds); }
public CancellationTokenSource Execute(ICanExecute value) { CleanupCompletedTasks(); CancellationTokenSource cancelSource; Task task; if (!value.IsMultiInstance) { lock (singleInstanceTasks) { if (singleInstanceTasks.ContainsKey(value)) { // Already running Console.WriteLine("Single instance already running, skipping"); return null; } cancelSource = Execute(cancelToken => { value.Execute(cancelToken); RemoveExecutingTask(value); }, value.Name, out task); singleInstanceTasks.Add(value, task); } } else { cancelSource = Execute(cancelToken => { value.Execute(cancelToken); RemoveExecutingTask(value); }, value.Name, out task); } lock (executingTasks) { executingTasks.Add(new ExecuteInstance { CancelSource = cancelSource, Instance = value, Task = task }); } return cancelSource; }
private void RemoveExecutingTask(ICanExecute value) { lock (executingTasks) { foreach (var execInstance in this.executingTasks.ToList()) { if (execInstance.Instance == value) { this.executingTasks.Remove(execInstance); } } } }