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