Beispiel #1
0
        private bool AssignTaskToProcessor(Guid taskId, Type taskType, Guid taskProcessorId)
        {
            Trace.WriteLine("ENTER: Assigning task '{0}' to processor '{1}' ...".FormatInvariant(taskId, taskProcessorId));

            this.repository.TaskRuntimeInfo.Assign(taskId, taskProcessorId);

            using (ManualResetEventSlim blocker = new ManualResetEventSlim())
            {
                this.assignTaskWaitHandlers.TryAdd(taskId, blocker);

                ITaskMessageBusSender taskMessageBus = this.messageBus.Tasks.GetSender(taskType);

                ThreadPool.QueueUserWorkItem(state =>
                {
                    taskMessageBus.NotifyTaskAssigned(taskId, taskProcessorId);
                });

                bool result = blocker.Wait(this.assignTaskTimeout);

                ManualResetEventSlim blocker1;

                this.assignTaskWaitHandlers.TryRemove(taskId, out blocker1);

                if (result)
                {
                    Trace.WriteLine("EXIT: Task '{0}' assigned successfully to processor '{1}'.".FormatInvariant(taskId, taskProcessorId));
                }
                else
                {
                    Trace.WriteLine("EXIT: Failed to assign task '{0}' to processor '{1}'. Response was not receive after {2} timeout.".FormatInvariant(taskId, taskProcessorId, this.assignTaskTimeout));
                }

                return(result);
            }
        }