public void RaiseNotifications(OperationStatusChangeNotification operationStatusChangeNotification) { OnOperationStatusChange?.Invoke(operationStatusChangeNotification); foreach (var connection in Connections) { connection.Value.SendOperationStatusChangeNotification(operationStatusChangeNotification); } }
public void SendOperationStatusChangeNotification(OperationStatusChangeNotification notification) { if (_watchAllOperations > 0) { Send(notification); return; } if (_matchingOperations.Contains(notification.OperationId)) { Send(notification); } }
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 }); } }
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); }
private void RaiseNotifications(OperationStatusChangeNotification notification) { _db.Notifications.RaiseNotifications(notification); }
public void Send(OperationStatusChangeNotification operationStatusChangeNotification) { OnOperationStatusChangeNotification?.Invoke(operationStatusChangeNotification); }