コード例 #1
0
        //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");
            }
        }