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 do { Dictionary <string, ConfiguredTask> original = _Tasks; if (!original.ContainsKey(taskConfig.Identifier)) { Dictionary <string, ConfiguredTask> 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)) { var random = new Random(); Thread.Sleep(random.Next(50)); continue; } return(true); } } return(false); } while (true); }
private Uri BuildTaskCallbackUri(ConfiguredTask taskConfig, long occurrence) { if (!taskConfig.Url.IsAbsoluteUri && HttpContext.Current != null && HttpContext.Current.Request != null) { string callbackUrlLeftPart = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); return(new Uri(string.Concat( callbackUrlLeftPart, _RecurringTaskHandlerAbsolutePath, taskConfig.Identifier, "/", occurrence.ToString(CultureInfo.InvariantCulture) ), UriKind.Absolute)); } return(new Uri(string.Concat( taskConfig.Url.Scheme, Uri.SchemeDelimiter, taskConfig.Url.Authority, _RecurringTaskHandlerAbsolutePath, taskConfig.Identifier, "/", occurrence.ToString(CultureInfo.InvariantCulture) ))); }
public bool Add(ConfiguredTask taskConfig) { // A proper immutable dictionary class would simplify this routine do { Dictionary<string, ConfiguredTask> original = _Tasks; if (!original.ContainsKey(taskConfig.Identifier)) { Dictionary<string, ConfiguredTask> 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)) { var random = new Random(); Thread.Sleep(random.Next(50)); 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); }
private CallbackRequest PrepareNextCallback(ConfiguredTask taskConfig) { long occurrence = taskConfig.GetNextOccurrence(); Uri callbackUri = this.BuildTaskCallbackUri(taskConfig, occurrence); DateTimeOffset callbackTime = new DateTimeOffset(occurrence, TimeSpan.Zero); return(new CallbackRequest(callbackTime, callbackUri)); }
protected internal bool TryGetTask(string identifier, out ConfiguredTask taskConfig) { if (string.IsNullOrEmpty(identifier)) { taskConfig = null; return(false); } return(_TaskCollection.TryGetTask(identifier, out taskConfig)); }
private void AddTask(IClockSource clockSource, PeriodicityType periodicity, int hour, int minute, Uri url) { using (var taskBuilder = new TaskBuilder(this.CallbackBaseUri)) { ConfiguredTask taskConfig = taskBuilder.Create(clockSource, periodicity, hour, minute, url); if (_TaskCollection.Add(taskConfig)) { if (this.CallbackBaseUri == null) { this.ScavengeForCallbackBaseUri(taskConfig.Url); } this.Schedule(this.PrepareNextCallback(taskConfig)); if (!_CurrentState.IsActive) { Start(); } } } }
internal void Reschedule(ConfiguredTask taskConfig) { this.Schedule(this.PrepareNextCallback(taskConfig)); }
public bool TryGetTask(string identifier, out ConfiguredTask taskConfig) { return _Tasks.TryGetValue(identifier, out taskConfig); }
public bool Remove(ConfiguredTask taskConfig) { return Remove(taskConfig.Identifier); }
private Uri BuildTaskCallbackUri(ConfiguredTask taskConfig, long occurrence) { if (!taskConfig.Url.IsAbsoluteUri && HttpContext.Current != null && HttpContext.Current.Request != null) { string callbackUrlLeftPart = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); return new Uri(string.Concat( callbackUrlLeftPart, _RecurringTaskHandlerAbsolutePath, taskConfig.Identifier, "/", occurrence.ToString(CultureInfo.InvariantCulture) ), UriKind.Absolute); } return new Uri(string.Concat( taskConfig.Url.Scheme, Uri.SchemeDelimiter, taskConfig.Url.Authority, _RecurringTaskHandlerAbsolutePath, taskConfig.Identifier, "/", occurrence.ToString(CultureInfo.InvariantCulture) )); }
private CallbackRequest PrepareNextCallback(ConfiguredTask taskConfig) { long occurrence = taskConfig.GetNextOccurrence(); Uri callbackUri = this.BuildTaskCallbackUri(taskConfig, occurrence); DateTimeOffset callbackTime = new DateTimeOffset(occurrence, TimeSpan.Zero); return new CallbackRequest(callbackTime, callbackUri); }
public bool TryGetTask(string identifier, out ConfiguredTask taskConfig) { return(_Tasks.TryGetValue(identifier, out taskConfig)); }
public bool Remove(ConfiguredTask taskConfig) { return(Remove(taskConfig.Identifier)); }
internal bool TryGetTask(string identifier, out ConfiguredTask taskConfig) { if (string.IsNullOrEmpty(identifier)) { taskConfig = null; return false; } return _TaskCollection.TryGetTask(identifier, out taskConfig); }
internal void Reschedule(ConfiguredTask taskConfig) { this.Schedule(this.PrepareNextCallback(taskConfig)); }