コード例 #1
0
        public void RaiseNotifications(OperationStatusChangeNotification operationStatusChangeNotification)
        {
            OnOperationStatusChange?.Invoke(operationStatusChangeNotification);

            foreach (var connection in Connections)
            {
                connection.Value.SendOperationStatusChangeNotification(operationStatusChangeNotification);
            }
        }
コード例 #2
0
        public void SendOperationStatusChangeNotification(OperationStatusChangeNotification notification)
        {
            if (_watchAllOperations > 0)
            {
                Send(notification);
                return;
            }

            if (_matchingOperations.Contains(notification.OperationId))
            {
                Send(notification);
            }
        }
コード例 #3
0
        private void Send(OperationStatusChangeNotification notification)
        {
            var value = new DynamicJsonValue
            {
                ["Type"]  = "OperationStatusChangeNotification",
                ["Value"] = new DynamicJsonValue
                {
                    [nameof(OperationStatusChangeNotification.OperationId)] = (int)notification.OperationId,
                    [nameof(OperationStatusChangeNotification.State)]       = notification.State.ToJson()
                },
            };

            if (_disposeToken.IsCancellationRequested == false)
            {
                _sendQueue.Enqueue(new NotificationValue
                {
                    ValueToSend = value,
                    AllowSkip   = false
                });
            }
        }
コード例 #4
0
        public Task <IOperationResult> AddOperation(string description, PendingOperationType opererationType, Func <Action <IOperationProgress>, Task <IOperationResult> > taskFactory,
                                                    long id, OperationCancelToken token = null)
        {
            var operationState = new OperationState
            {
                Status = OperationStatus.InProgress
            };

            var notification = new OperationStatusChangeNotification
            {
                OperationId = id,
                State       = operationState
            };

            Action <IOperationProgress> action = progress =>
            {
                notification.State.Progress = progress;
                RaiseNotifications(notification);
            };
            var task = taskFactory(action);

            var operationDescription = new PendingOperationDescription
            {
                Description = description,
                TaskType    = opererationType,
                StartTime   = SystemTime.UtcNow
            };

            var pendingOperation = new PendingOperation
            {
                Id          = id,
                Task        = task,
                Description = operationDescription,
                Token       = token,
                State       = operationState
            };

            task.ContinueWith(taskResult =>
            {
                operationDescription.EndTime = SystemTime.UtcNow;
                operationState.Progress      = null;
                if (taskResult.IsCanceled)
                {
                    operationState.Result = null;
                    operationState.Status = OperationStatus.Canceled;
                }
                else if (taskResult.IsFaulted)
                {
                    var innerException = taskResult.Exception.ExtractSingleInnerException();

                    var documentConflictException = innerException as DocumentConflictException;
                    var status            = documentConflictException != null ? 409 : 500;
                    operationState.Result = new OperationExceptionResult(innerException, status);
                    operationState.Status = OperationStatus.Faulted;
                }
                else
                {
                    operationState.Result = taskResult.Result;
                    operationState.Status = OperationStatus.Completed;
                }

                RaiseNotifications(notification);
            });

            _pendingOperations.TryAdd(id, pendingOperation);
            return(task);
        }
コード例 #5
0
 private void RaiseNotifications(OperationStatusChangeNotification notification)
 {
     _db.Notifications.RaiseNotifications(notification);
 }
コード例 #6
0
 public void Send(OperationStatusChangeNotification operationStatusChangeNotification)
 {
     OnOperationStatusChangeNotification?.Invoke(operationStatusChangeNotification);
 }