public override object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values[0] is WpfObservableRangeCollection <Layer> layers && values[1] is LayerStructure structure)
            {
                if (cachedTree == null)
                {
                    cachedTree = new StructuredLayerTree(layers, structure);
                }

                if (TryFindStructureDifferences(structure) ||
                    lastLayerGuids.Count != layers.Count ||
                    LayerOrderIsDifferent(layers) ||
                    LayersAreDifferentObjects(layers, lastLayers))
                {
                    cachedTree     = new StructuredLayerTree(layers, structure);
                    lastLayers     = layers;
                    lastLayerGuids = layers.Select(x => x.GuidValue).ToList();
                    lastStructure  = structure.CloneGroups();
                }

                return(cachedTree.RootDirectoryItems);
            }

            return(DependencyProperty.UnsetValue);
        }
Пример #2
0
 public WpfObservableRangeTree(WpfObservableRangeCollection <T> nodes) : base(nodes)
 {
     foreach (var treeNode in nodes.OfType <ITreeNode <T> >())
     {
         if (treeNode.Children is INotifyTreeChanged observableTree)
         {
             observableTree.TreeChanged += OnNodesTreeChanged;
         }
     }
 }
Пример #3
0
        /// <summary>
        /// Deep clones groups.
        /// </summary>
        /// <param name="groups">Groups to clone.</param>
        /// <returns>ObservableCollection with cloned groups.</returns>
        public static WpfObservableRangeCollection <GuidStructureItem> CloneGroups(WpfObservableRangeCollection <GuidStructureItem> groups)
        {
            WpfObservableRangeCollection <GuidStructureItem> outputGroups = new();

            foreach (var group in groups.ToArray())
            {
                outputGroups.Add(group.CloneGroup());
            }

            return(outputGroups);
        }
Пример #4
0
        private ObservableCollection <GuidStructureItem> GetSubGroups(IEnumerable <GuidStructureItem> groups)
        {
            WpfObservableRangeCollection <GuidStructureItem> finalGroups = new WpfObservableRangeCollection <GuidStructureItem>();

            foreach (var group in groups)
            {
                finalGroups.AddRange(GetSubGroups(group));
            }

            return(finalGroups);
        }
        public async Task <WindowsService[]> ReadWindowsServiceDynamicDataAsync(
            WpfObservableRangeCollection <WindowsService> windowsServiceDynamicObservableCollection,
            WorkstationMonitorServiceClient workstationMonitorServiceClient,
            CancellationToken cancellationToken)
        {
            WindowsService[] result = await workstationMonitorServiceClient.ReadWindowsServiceDynamicDataAsync();

            if (result != null && !cancellationToken.IsCancellationRequested)
            {
                windowsServiceDynamicObservableCollection.ReplaceRange(result, new WindowsServiceComparer());
            }

            return(result);
        }
        private DynamicLineChartViewModel GetOrCreateNewLineChartIfNotExists(
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModel,
            Sensor sensor,
            string hardwareName)
        {
            DynamicLineChartViewModel chartViewModel = dynamicChartViewModel
                                                       .Where(x => x.ChartName == sensor.SensorType && x.HardwareName == hardwareName)
                                                       .SingleOrDefault();

            if (chartViewModel == null)
            {
                chartViewModel = new DynamicLineChartViewModel(sensor.SensorType, hardwareName);
                this.InvokeInUIThread((Action)(() => dynamicChartViewModel.Add(chartViewModel)));
            }

            return(chartViewModel);
        }
        public void DrawDynamicPieChartForHardwareSensor(
            WpfObservableRangeCollection <DynamicPieChartViewModel> dynamicChartViewModel,
            Sensor sensor,
            string hardwareName)
        {
            if (sensor.Value == "No value")
            {
                return;
            }

            DynamicPieChartViewModel chartViewModel = this.GetOrCreateNewPieChartIfNotExists(dynamicChartViewModel, sensor, hardwareName);

            this.AddNewValuesToDynamicViewLabels(chartViewModel, sensor);

            // In case of "SmallData" sensor type, Open Hardware Monitor returns also total amount of data
            // which is not requested by view
            if (sensor.SensorType == "SmallData" && sensor.SensorName.ToLower().Contains("total"))
            {
                return;
            }

            this.AddNewPieChartSliceIfNotExists(sensor, chartViewModel);
            this.RefreshValueInPieSeries(sensor, chartViewModel);

            // Open Hardware Monitor defines load for hard disk as "Used Space" abd does not provide "Free Memoery Space"
            // In order to display it as pie chart we need to define mocked sensor - "Not Used Space"
            // to calculate not used memory part
            if (sensor.SensorType == "Load" && sensor.Unit == "%" && sensor.SensorName == "Used Space")
            {
                Sensor notUsedMemoryMockedSensor = new Sensor()
                {
                    Unit       = "%",
                    SensorName = "Not Used Space",
                    SensorType = "Load",
                    Value      = (100d - double.Parse(sensor.Value)).ToString(),
                };

                this.AddNewValuesToDynamicViewLabels(chartViewModel, notUsedMemoryMockedSensor);
                this.AddNewPieChartSliceIfNotExists(notUsedMemoryMockedSensor, chartViewModel);
                this.RefreshValueInPieSeries(notUsedMemoryMockedSensor, chartViewModel);
            }
        }
        public IAsyncCommand CreateWindowsServiceDynamicDataCommand(WpfObservableRangeCollection <WindowsService> windowsService)
        {
            return(new AsyncCommand <bool>(async(cancellationToken) =>
            {
                return await Task.Run(async() =>
                {
                    WorkstationMonitorServiceClient workstationMonitorServiceClient = null;
                    bool result = false;
                    try
                    {
                        workstationMonitorServiceClient = await this.wcfClient.GetNewWorkstationMonitorServiceClient();

                        // Set the task.
                        var neverEndingTask = this.tPLFactory.CreateNeverEndingTaskMakingWcfCalls(
                            (now, ct, client) => this.wcfClient.ReadWindowsServiceDynamicDataAsync(windowsService, client, ct)
                            .WithCancellation(ct),
                            cancellationToken,
                            this.configProvider.DelayBetweenCalls_WindowsService,
                            this.wcfClient.MachineIdentifier,
                            workstationMonitorServiceClient);

                        // Start the task. Post the time.
                        result = neverEndingTask.Post(DateTimeOffset.Now);

                        // if cancel was not requested task is still ongoing
                        while (!cancellationToken.IsCancellationRequested)
                        {
                            await Task.Delay(this.neverEndingCommandDelayInMiliSeconds);
                        }
                    }
                    catch (InvalidOperationException ex)
                    {
                        this.messageSender.SendErrorMessage(ex.Message);
                    }

                    return result;
                });
            }));
        }
        public void DrawDynamicLineChartForHardwareSensor(
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModel,
            Sensor sensor,
            string hardwareName)
        {
            // In case of "No Value" returned from SystemManagamentLib do not generate charts
            if (sensor.Value == "No value")
            {
                return;
            }

            DynamicLineChartViewModel chartViewModel = this.GetOrCreateNewLineChartIfNotExists(dynamicChartViewModel, sensor, hardwareName);

            this.AddNewValuesToDynamicViewLabels(chartViewModel, sensor);

            this.AddNewLineSeriesIfNotExists(sensor, chartViewModel);

            this.AdjustChartValuesRange(sensor, chartViewModel);

            this.AddNewValuesToLineSeries(sensor, chartViewModel);

            chartViewModel.SetAxisLimits(DateTime.Now);
        }
Пример #10
0
 public LayerStructure(Document owner)
 {
     Groups = new WpfObservableRangeCollection <GuidStructureItem>();
     Owner  = owner;
 }
Пример #11
0
 public LayerStructure(WpfObservableRangeCollection <GuidStructureItem> items, Document owner)
 {
     Groups = items;
     Owner  = owner;
 }
        public async Task <HardwareDynamicData> ReadHardwareDynamicDataAsync(
            WpfObservableRangeCollection <HardwareDynamicData> hardwareDynamicObservableCollection,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelProcessorClock,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelProcessorPower,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelProcessorTemp,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelProcessorLoad,
            WpfObservableRangeCollection <DynamicPieChartViewModel> dynamicChartViewModelDiskLoad,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelDiskTemp,
            WpfObservableRangeCollection <DynamicPieChartViewModel> dynamicChartViewModelMemoryData,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelGPULoad,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelGPUTemp,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelGPUClock,
            WpfObservableRangeCollection <DynamicPieChartViewModel> dynamicChartViewModelGPUData,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelGPUVoltage,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelGPUFan,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelMainBoardTemp,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelMainBoardFan,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelMainBoardVoltage,
            bool logsEnabled,
            string logsDirectoryPath,
            WorkstationMonitorServiceClient workstationMonitorServiceClient,
            CancellationToken cancellationToken)
        {
            HardwareDynamicData result = await workstationMonitorServiceClient.ReadHardwareDynamicDataAsync();

            if (result != null && !cancellationToken.IsCancellationRequested)
            {
                string fileName = string.Empty;

                foreach (var processor in result.Processor)
                {
                    fileName = this.GenerateLogFileNameForSensor(logsDirectoryPath, "CPU");

                    foreach (var load in processor.Load)
                    {
                        this.dynamicDataHelper.DrawDynamicLineChartForHardwareSensor(dynamicChartViewModelProcessorLoad, load, processor.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, load);
                    }

                    foreach (var clock in processor.Clock)
                    {
                        this.dynamicDataHelper.DrawDynamicLineChartForHardwareSensor(dynamicChartViewModelProcessorClock, clock, processor.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, clock);
                    }

                    foreach (var power in processor.Power)
                    {
                        this.dynamicDataHelper.DrawDynamicLineChartForHardwareSensor(dynamicChartViewModelProcessorPower, power, processor.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, power);
                    }

                    foreach (var temperature in processor.Temperature)
                    {
                        this.dynamicDataHelper.DrawDynamicLineChartForHardwareSensor(dynamicChartViewModelProcessorTemp, temperature, processor.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, temperature);
                    }
                }

                foreach (var disk in result.Disk)
                {
                    fileName = this.GenerateLogFileNameForSensor(logsDirectoryPath, "DISK");

                    foreach (var load in disk.Load)
                    {
                        this.dynamicDataHelper.DrawDynamicPieChartForHardwareSensor(dynamicChartViewModelDiskLoad, load, disk.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, load);
                    }

                    foreach (var temperature in disk.Temperature)
                    {
                        this.dynamicDataHelper.DrawDynamicLineChartForHardwareSensor(dynamicChartViewModelDiskTemp, temperature, disk.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, temperature);
                    }
                }

                foreach (var memory in result.Memory)
                {
                    fileName = this.GenerateLogFileNameForSensor(logsDirectoryPath, "MEMORY");

                    foreach (var data in memory.Data)
                    {
                        this.dynamicDataHelper.DrawDynamicPieChartForHardwareSensor(dynamicChartViewModelMemoryData, data, memory.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, data);
                    }
                }

                foreach (var gpu in result.VideoController)
                {
                    fileName = this.GenerateLogFileNameForSensor(logsDirectoryPath, "GPU");

                    foreach (var load in gpu.Load)
                    {
                        this.dynamicDataHelper.DrawDynamicLineChartForHardwareSensor(dynamicChartViewModelGPULoad, load, gpu.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, load);
                    }

                    foreach (var temperature in gpu.Temperature)
                    {
                        this.dynamicDataHelper.DrawDynamicLineChartForHardwareSensor(dynamicChartViewModelGPUTemp, temperature, gpu.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, temperature);
                    }

                    foreach (var clock in gpu.Clock)
                    {
                        this.dynamicDataHelper.DrawDynamicLineChartForHardwareSensor(dynamicChartViewModelGPUClock, clock, gpu.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, clock);
                    }

                    foreach (var data in gpu.Data)
                    {
                        this.dynamicDataHelper.DrawDynamicPieChartForHardwareSensor(dynamicChartViewModelGPUData, data, gpu.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, data);
                    }

                    foreach (var voltage in gpu.Voltage)
                    {
                        this.dynamicDataHelper.DrawDynamicLineChartForHardwareSensor(dynamicChartViewModelGPUVoltage, voltage, gpu.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, voltage);
                    }

                    foreach (var fan in gpu.Fan)
                    {
                        this.dynamicDataHelper.DrawDynamicLineChartForHardwareSensor(dynamicChartViewModelGPUFan, fan, gpu.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, fan);
                    }
                }

                foreach (var mainBoard in result.MainBoard)
                {
                    fileName = this.GenerateLogFileNameForSensor(logsDirectoryPath, "MAINBOARD");

                    foreach (var temperature in mainBoard.Temperature)
                    {
                        this.dynamicDataHelper.DrawDynamicLineChartForHardwareSensor(dynamicChartViewModelMainBoardTemp, temperature, mainBoard.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, temperature);
                    }

                    foreach (var fan in mainBoard.Fan)
                    {
                        this.dynamicDataHelper.DrawDynamicLineChartForHardwareSensor(dynamicChartViewModelMainBoardFan, fan, mainBoard.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, fan);
                    }

                    foreach (var voltage in mainBoard.Voltage)
                    {
                        this.dynamicDataHelper.DrawDynamicLineChartForHardwareSensor(dynamicChartViewModelMainBoardVoltage, voltage, mainBoard.Name);
                        this.LogSensorValueIfRequested(logsEnabled, fileName, voltage);
                    }
                }
            }

            return(result);
        }
        public IAsyncCommand CreateSoftwareStaticDataCommand(
            WpfObservableRangeCollection <CurrentUser> currentUser,
            WpfObservableRangeCollection <OS> operatingSystem,
            WpfObservableRangeCollection <Bios> bios,
            WpfObservableRangeCollection <InstalledProgram> installedProgram,
            WpfObservableRangeCollection <MicrosoftWindowsUpdate> microsoftWindowsUpdate,
            WpfObservableRangeCollection <StartupCommand> startupCommand,
            WpfObservableRangeCollection <LocalUser> localUser)
        {
            return(new AsyncCommand <SoftwareStaticData>(async(cancellationToken) =>
            {
                return await Task.Run(async() =>
                {
                    WorkstationMonitorServiceClient workstationMonitorServiceClient = null;
                    SoftwareStaticData result = null;

                    try
                    {
                        workstationMonitorServiceClient = await this.wcfClient.GetNewWorkstationMonitorServiceClient();

                        result = await this.wcfClient.ReadSoftwareStaticDataAsync(workstationMonitorServiceClient)
                                 .WithCancellation(cancellationToken)
                                 // Following statements will be processed in the same thread, won't use caught context (UI)
                                 .ConfigureAwait(false);

                        if (cancellationToken.IsCancellationRequested)
                        {
                            workstationMonitorServiceClient.Abort();
                        }
                        else
                        {
                            workstationMonitorServiceClient.Close();
                        }

                        if (result != null && !cancellationToken.IsCancellationRequested)
                        {
                            currentUser.ReplaceRange(result.CurrentUser, new CurrentUserStaticComparer());
                            operatingSystem.ReplaceRange(result.OperatingSystem, new OSComparer());
                            bios.ReplaceRange(result.Bios, new BiosComparer());
                            installedProgram.ReplaceRange(result.InstalledProgram, new InstalledProgramComparer());
                            microsoftWindowsUpdate.ReplaceRange(result.MicrosoftWindowsUpdate, new MicrosoftWindowsUpdateComparer());
                            startupCommand.ReplaceRange(result.StartupCommand, new StartupCommandComparer());
                            localUser.ReplaceRange(result.LocalUser, new LocalUserComparer());
                        }
                    }
                    catch (InvalidOperationException ex)
                    {
                        this.messageSender.SendErrorMessage(ex.Message);

                        // Rethrow exception in order to set correct Task state (Faulted)
                        throw;
                    }
                    catch (EndpointNotFoundException)
                    {
                        this.messageSender.SendErrorMessageEndpointNotFound();
                        this.messageSender.SendCancelCommandMessage(this.wcfClient.MachineIdentifier);
                        workstationMonitorServiceClient.Abort();

                        throw;
                    }
                    catch (TimeoutException)
                    {
                        this.messageSender.SendErrorMessageTimeout();
                        this.messageSender.SendCancelCommandMessage(this.wcfClient.MachineIdentifier);
                        workstationMonitorServiceClient.Abort();

                        throw;
                    }
                    catch (CommunicationException ex)
                    {
                        this.messageSender.SendErrorMessage(ex.Message);
                        this.messageSender.SendCancelCommandMessage(this.wcfClient.MachineIdentifier);
                        workstationMonitorServiceClient.Abort();

                        throw;
                    }

                    return result;
                });
            }));
        }
        public IAsyncCommand CreateHardwareStaticDataCommand(
            WpfObservableRangeCollection <ProcessorStatic> processorStatic,
            WpfObservableRangeCollection <ProcessorCache> processorCache,
            WpfObservableRangeCollection <Memory> memoryItems,
            WpfObservableRangeCollection <BaseBoard> baseBoard,
            WpfObservableRangeCollection <VideoController> videoController,
            WpfObservableRangeCollection <NetworkAdapter> networkAdapter,
            WpfObservableRangeCollection <PnPEntity> pnPEntity,
            WpfObservableRangeCollection <CDROMDrive> cDROMDrive,
            WpfObservableRangeCollection <Fan> fan,
            WpfObservableRangeCollection <Printer> printer,
            WpfObservableRangeCollection <Battery> battery,
            WpfObservableRangeCollection <Storage> storage)
        {
            return(new AsyncCommand <HardwareStaticData>(async(cancellationToken) =>
            {
                WorkstationMonitorServiceClient workstationMonitorServiceClient = null;
                HardwareStaticData result = null;
                try
                {
                    workstationMonitorServiceClient = await this.wcfClient.GetNewWorkstationMonitorServiceClient();

                    result = await Task.Run <HardwareStaticData>(() => workstationMonitorServiceClient.ReadHardwareStaticDataAsync())
                             .WithCancellation(cancellationToken)
                             // Following statements will be processed in the same thread, won't use caught context (UI)
                             .ConfigureAwait(false);

                    if (cancellationToken.IsCancellationRequested)
                    {
                        workstationMonitorServiceClient.Abort();
                    }
                    else
                    {
                        workstationMonitorServiceClient.Close();
                    }

                    if (result != null && !cancellationToken.IsCancellationRequested)
                    {
                        processorStatic.ReplaceRange(result.Processor, new ProcessorStaticComparer());
                        processorCache.ReplaceRange(result.ProcessorCache, new ProcessorCacheStaticComparer());
                        memoryItems.ReplaceRange(result.Memory, new MemoryStaticComparer());
                        baseBoard.ReplaceRange(result.BaseBoard, new BaseBoardStaticComparer());
                        videoController.ReplaceRange(result.VideoController, new VideoControllerStaticComparer());
                        networkAdapter.ReplaceRange(result.NetworkAdapter, new NetworkAdapterStaticComparer());
                        pnPEntity.ReplaceRange(result.PnPEntity, new PnPEntityStaticComparer());
                        cDROMDrive.ReplaceRange(result.CDROMDrive, new CDROMDriveStaticComparer());
                        fan.ReplaceRange(result.Fan, new FanStaticComparer());
                        printer.ReplaceRange(result.Printer, new PrinterStaticComparer());
                        battery.ReplaceRange(result.Battery, new BatteryStaticComparer());
                        storage.ReplaceRange(result.Storage);
                    }
                }
                catch (InvalidOperationException ex)
                {
                    this.messageSender.SendErrorMessage(ex.Message);

                    // Rethrow exception in order to set correct Task state (Faulted)
                    throw;
                }
                catch (EndpointNotFoundException)
                {
                    this.messageSender.SendErrorMessageEndpointNotFound();
                    this.messageSender.SendCancelCommandMessage(this.wcfClient.MachineIdentifier);
                    workstationMonitorServiceClient.Abort();

                    throw;
                }
                catch (TimeoutException)
                {
                    this.messageSender.SendErrorMessageTimeout();
                    this.messageSender.SendCancelCommandMessage(this.wcfClient.MachineIdentifier);
                    workstationMonitorServiceClient.Abort();

                    throw;
                }
                catch (CommunicationException ex)
                {
                    this.messageSender.SendErrorMessage(ex.Message);
                    this.messageSender.SendCancelCommandMessage(this.wcfClient.MachineIdentifier);
                    workstationMonitorServiceClient.Abort();

                    throw;
                }

                return result;
            }));
        }
        public IAsyncCommand CreateHardwareDynamicDataCommand(
            WpfObservableRangeCollection <HardwareDynamicData> hardwareDynamic,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelProcessorClock,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelProcessorPower,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelProcessorTemp,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelProcessorLoad,
            WpfObservableRangeCollection <DynamicPieChartViewModel> dynamicChartViewModelDiskLoad,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelDiskTemp,
            WpfObservableRangeCollection <DynamicPieChartViewModel> dynamicChartViewModelMemoryData,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelGPULoad,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelGPUTemp,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelGPUClock,
            WpfObservableRangeCollection <DynamicPieChartViewModel> dynamicChartViewModelGPUData,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelGPUVoltage,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelGPUFan,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelMainBoardTemp,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelMainBoardFan,
            WpfObservableRangeCollection <DynamicLineChartViewModel> dynamicChartViewModelMainBoardVoltage,
            string machineName)
        {
            return(new AsyncCommandParameterized <bool>(
                       async(cancellationToken, nameOfMachine) =>
            {
                return await Task.Run(async() =>
                {
                    WorkstationMonitorServiceClient workstationMonitorServiceClient = null;
                    bool result = false;
                    try
                    {
                        workstationMonitorServiceClient = await this.wcfClient.GetNewWorkstationMonitorServiceClient();
                        bool logsEnabled = false;
                        DirectoryInfo logsDirectory = null;

                        if (this.configProvider.DynamicHardwareLogs_Include)
                        {
                            string logsPath = this.configProvider.DynamicHardwareLogs_Path;
                            if (!string.IsNullOrEmpty(logsPath))
                            {
                                string directoryName = nameOfMachine + "_Hardware_Dynamic_Logs\\";
                                logsDirectory = Directory.CreateDirectory(logsPath + directoryName);
                                logsEnabled = true;
                            }
                        }

                        string logsDirectoryPath = logsDirectory?.FullName ?? string.Empty;

                        // Set the task.
                        var neverEndingTask = this.tPLFactory.CreateNeverEndingTaskMakingWcfCalls(
                            (now, ct, client) => this.wcfClient.ReadHardwareDynamicDataAsync(
                                hardwareDynamic,
                                dynamicChartViewModelProcessorClock,
                                dynamicChartViewModelProcessorPower,
                                dynamicChartViewModelProcessorTemp,
                                dynamicChartViewModelProcessorLoad,
                                dynamicChartViewModelDiskLoad,
                                dynamicChartViewModelDiskTemp,
                                dynamicChartViewModelMemoryData,
                                dynamicChartViewModelGPULoad,
                                dynamicChartViewModelGPUTemp,
                                dynamicChartViewModelGPUClock,
                                dynamicChartViewModelGPUData,
                                dynamicChartViewModelGPUVoltage,
                                dynamicChartViewModelGPUFan,
                                dynamicChartViewModelMainBoardTemp,
                                dynamicChartViewModelMainBoardFan,
                                dynamicChartViewModelMainBoardVoltage,
                                logsEnabled,
                                logsDirectoryPath,
                                client,
                                ct)
                            .WithCancellation(ct),
                            cancellationToken,
                            this.configProvider.DelayBetweenCalls_HardwareDynamic,
                            this.wcfClient.MachineIdentifier,
                            workstationMonitorServiceClient);

                        // Start the task. Post the time.
                        result = neverEndingTask.Post(DateTimeOffset.Now);

                        // if cancel was not requested task is still ongoing
                        while (!cancellationToken.IsCancellationRequested)
                        {
                            await Task.Delay(this.neverEndingCommandDelayInMiliSeconds);
                        }
                    }
                    catch (Exception ex)
                    {
                        this.messageSender.SendErrorMessage(ex.Message);
                    }
                    return result;
                });
            }, machineName));
        }
        public IAsyncCommand CreateWindowsLogDynamicDataCommand(WpfObservableRangeCollection <WindowsLog> windowsLog)
        {
            return(new AsyncCommand <WindowsLog[]>(async(cancellationToken) =>
            {
                WorkstationMonitorServiceClient workstationMonitorServiceClient = null;
                WindowsLog[] result = null;

                try
                {
                    workstationMonitorServiceClient = await this.wcfClient.GetNewWorkstationMonitorServiceClient();

                    result = await this.wcfClient.ReadWindowsLogDynamicDataAsync(workstationMonitorServiceClient)
                             .WithCancellation(cancellationToken)
                             // Following statements will be processed in the same thread, won't use caught context (UI)
                             .ConfigureAwait(false);

                    if (cancellationToken.IsCancellationRequested)
                    {
                        workstationMonitorServiceClient.Abort();
                    }
                    else
                    {
                        workstationMonitorServiceClient.Close();
                    }

                    if (result != null && !cancellationToken.IsCancellationRequested)
                    {
                        windowsLog.ReplaceRange(result, new WindowsLogComparer());
                    }
                }
                catch (InvalidOperationException ex)
                {
                    this.messageSender.SendErrorMessage(ex.Message);

                    // Rethrow exception in order to set correct Task state (Faulted)
                    throw;
                }
                catch (EndpointNotFoundException)
                {
                    this.messageSender.SendErrorMessageEndpointNotFound();
                    this.messageSender.SendCancelCommandMessage(this.wcfClient.MachineIdentifier);
                    workstationMonitorServiceClient.Abort();

                    throw;
                }
                catch (TimeoutException)
                {
                    this.messageSender.SendErrorMessageTimeout();
                    this.messageSender.SendCancelCommandMessage(this.wcfClient.MachineIdentifier);
                    workstationMonitorServiceClient.Abort();

                    throw;
                }
                catch (CommunicationException ex)
                {
                    this.messageSender.SendErrorMessage(ex.Message);
                    this.messageSender.SendCancelCommandMessage(this.wcfClient.MachineIdentifier);
                    workstationMonitorServiceClient.Abort();

                    throw;
                }
                return result;
            }));
        }