//Start Operation private async Task StartOperation() { //Определяем токен для отмены задач if (cancelTokenSource != null) { cancelTokenSource.Dispose(); } cancelTokenSource = new CancellationTokenSource(); token = cancelTokenSource.Token; //Создаем контроллер controller = new CalcController(controllerParameters); //Подписываемся на события контроллера #region Events Subscribe //Подписываемся на событие возникновения ршибки при записи значений в OPC controller.errorRaisedEvent += (o, ea) => { Dispatcher.Invoke(() => WriteToLog(((CustomEventArgs)ea).ErrorMessage)); }; //Подписываемся на события расчета параметров controller.parameterClaculatedSucceedEvent += (o, ea) => ParametersCalculatedFlipper(o, (CustomEventArgs)ea); //Успешный //Подписываемся на событие запроса реинициализации подключения controller.reinitalizeClientEvent += async(o, ea) => { await RestartOperation(token); WriteToLog((ea as CustomEventArgs).ErrorMessage); }; //Подписываемся на события готовности расчетных параметров (Capacity, Density,...) controller.capacitiesReadyEvent += (o, ea) => { //this.Dispatcher.Invoke(() => parametersUC.ParameterFilterComboBox.ItemsSource = from elem in controller.capacityCreator.nodeElementCollection // select elem.Name); }; controller.parametersReadyEvent += (o, ea) => { //this.Dispatcher.Invoke(() => parametersUC.ParameterFilterComboBox.IsEnabled = true); }; controller.densitiesReadyEvent += (o, ea) => { }; controller.contentsReadyEvent += (o, ea) => { }; #endregion //Подключение к OPC bool isOPCConnected = await controller.OpcServerConnect(); if (isOPCConnected) { Dispatcher.Invoke(() => StartCalculationButton.IsEnabled = false); } else { System.Windows.MessageBox.Show("OPC server is unavailable!", "Alert!", MessageBoxButton.OK, MessageBoxImage.Error); return; } //Создаем списки переменных и инициализируем их данными из OPC bool isInitSuccess = false; await Task.Run(() => { isInitSuccess = controller.InitializeParameters(); }).ContinueWith((o) => Dispatcher.Invoke(() => { parametersUC.CapacityGrid.ItemsSource = (controller.capacityCreator as CapacityCreator).CapacityList; parametersUC.DensityGrid.ItemsSource = (controller.densityCreator as DensityCreator).DensityList; parametersUC.ContentGrid.ItemsSource = (controller.contentCreator as ContentCreator).ContentList; parametersUC.TankGrid.ItemsSource = (controller.levelTankCreator as LevelTankCreator).LevelTankList; }) ); if (isInitSuccess) { //Запускаем процесс расчета WriteToLog("Server is started!\t"); controller.CancellationCommand = false; try { _ = Task.Run(() => { controller.CalculateParameters(token); }); } catch (Exception e) { WriteToLog(e.Message); } } else { WriteToLog("Can not start calculations due to isInitSuccess = false!\t"); } }