/// <inheritdoc />
        public void CancelTask(Guid taskId)
        {
            Trace.WriteLine("ENTER: Cancelling task '{0}' ...".FormatInvariant(taskId));

            Lazy <DateTime> timestampUtc = new Lazy <DateTime>(() => this.dateTimeProvider.UtcNow);

            ITaskRuntimeInfo taskInfo = this.repository.TaskRuntimeInfo.GetById(taskId);

            if (taskInfo == null)
            {
                throw new KeyNotFoundException("Task '{0}' was not found.".FormatInvariant(taskId));
            }

            switch (taskInfo.Status)
            {
            case TaskStatus.Canceled:
            case TaskStatus.Failed:
            case TaskStatus.Success:
                throw new InvalidOperationException("Task '{0}' status is {1} and will not be canceled.".FormatInvariant(taskId, taskInfo.Status));
            }

            ITaskMessageBusSender taskMessageBus = this.messageBus.Tasks.GetSender(taskInfo.TaskType);

            taskMessageBus.NotifyTaskCancelRequest(taskId, timestampUtc.Value);

            this.repository.TaskRuntimeInfo.RequestCancel(taskId, timestampUtc.Value);

            Trace.WriteLine("EXIT: Task '{0}' canceled.".FormatInvariant(taskId));
        }