Esempio n. 1
0
        /// <summary>
        /// Clears task and unsubscribes from current worker channel events.
        /// </summary>
        private void DiscardTask()
        {
            Contract.Requires(currentTask != null);
            Contract.Requires(currentTask.Worker == this);
            Contract.Ensures(currentTask == null);

            try
            {
                var operationContext = OperationContext.Current;
                operationContext.Channel.Closing -= OnChannelClosing;
                operationContext.Channel.Faulted -= OnChannelFaulted;

                currentTask.Worker = null;
                currentTask = null;
            }
            catch
            { }
        }
Esempio n. 2
0
        /// <summary>
        /// Request a task for execution.
        /// </summary>
        /// <returns>
        /// Blocks current thread until a task will be available for execution.
        /// </returns>
        public Task GetTask()
        {
            Contract.Requires<InvalidOperationException>(currentTask == null);

            var timeout = OperationContext.Current.Channel.OperationTimeout.Subtract(TimeSpan.FromMilliseconds(100));
            currentTask = taskQueue.PickTask(this, timeout);
            if (currentTask != null)
            {
                Logger.Write(
                    LogCategories.Information(string.Format("Task {0} assigned to {1}", currentTask, RemoteAddress),
                        LogCategories.TaskServices,
                        LogCategories.TaskProviderService));
                Trace.WriteLine(string.Format("Task {0} is assigned", currentTask));

                AssignTask();
                return currentTask.ToContract();
            }

            return null;
        }