public bool Add(ConfiguredTask taskConfig) { // A proper immutable dictionary class would simplify this routine RandomWaitScheduler retryScheduler = null; do { Dictionary <string, ConfiguredTask> original = _Tasks; if (!original.ContainsKey(taskConfig.Identifier)) { var clone = new Dictionary <string, ConfiguredTask>(original); if (!clone.ContainsKey(taskConfig.Identifier)) { clone.Add(taskConfig.Identifier, taskConfig); if (!object.ReferenceEquals(Interlocked.CompareExchange(ref _Tasks, clone, original), original)) { if (retryScheduler == null) { retryScheduler = new RandomWaitScheduler(); } retryScheduler.Wait(); continue; } return(true); } } return(false); } while (true); }
public bool Add(ConfiguredTask taskConfig) { // A proper immutable dictionary class would simplify this routine RandomWaitScheduler retryScheduler = null; do { Dictionary<string, ConfiguredTask> original = _Tasks; if (!original.ContainsKey(taskConfig.Identifier)) { var clone = new Dictionary<string, ConfiguredTask>(original); if (!clone.ContainsKey(taskConfig.Identifier)) { clone.Add(taskConfig.Identifier, taskConfig); if (!object.ReferenceEquals(Interlocked.CompareExchange(ref _Tasks, clone, original), original)) { if (retryScheduler == null) { retryScheduler = new RandomWaitScheduler(); } retryScheduler.Wait(); continue; } return true; } } return false; } while (true); }