Пример #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);
        }
Пример #2
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);
		}