Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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)
                               )));
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
		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);
		}
Esempio n. 6
0
        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));
        }
Esempio n. 7
0
        protected internal bool TryGetTask(string identifier, out ConfiguredTask taskConfig)
        {
            if (string.IsNullOrEmpty(identifier))
            {
                taskConfig = null;
                return(false);
            }

            return(_TaskCollection.TryGetTask(identifier, out taskConfig));
        }
Esempio n. 8
0
        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();
                    }
                }
            }
        }
Esempio n. 9
0
 internal void Reschedule(ConfiguredTask taskConfig)
 {
     this.Schedule(this.PrepareNextCallback(taskConfig));
 }
Esempio n. 10
0
		public bool TryGetTask(string identifier, out ConfiguredTask taskConfig)
		{
			return _Tasks.TryGetValue(identifier, out taskConfig);
		}
Esempio n. 11
0
		public bool Remove(ConfiguredTask taskConfig)
		{
			return Remove(taskConfig.Identifier);
		}
Esempio n. 12
0
        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)
                ));
        }
Esempio n. 13
0
 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);
 }
Esempio n. 14
0
 public bool TryGetTask(string identifier, out ConfiguredTask taskConfig)
 {
     return(_Tasks.TryGetValue(identifier, out taskConfig));
 }
Esempio n. 15
0
 public bool Remove(ConfiguredTask taskConfig)
 {
     return(Remove(taskConfig.Identifier));
 }
Esempio n. 16
0
        internal bool TryGetTask(string identifier, out ConfiguredTask taskConfig)
        {
            if (string.IsNullOrEmpty(identifier))
            {
                taskConfig = null;
                return false;
            }

            return _TaskCollection.TryGetTask(identifier, out taskConfig);
        }
Esempio n. 17
0
 internal void Reschedule(ConfiguredTask taskConfig)
 {
     this.Schedule(this.PrepareNextCallback(taskConfig));
 }