private async void Scan() { FilterColumns.Clear(); if (!ValidateIpRanges()) { return; } if (AppStats.ApplicationState == AppState.Supervising) { RequestStop(); } await Task.Run(() => { while (AppStats.CurrentlyRunningThreadsCount > 0) // to avoid concurency when manual rescan invoked TODO: develop some better solution { Thread.Sleep(100); } if (_currentTaskIsFinishedEvent.WaitOne()) { if (AppStats.ApplicationState != AppState.Chilling && AppStats.ApplicationState != AppState.Supervising) { _currentTaskIsFinishedEvent.Set(); return; } ScanningProcessStarted?.Invoke(); ResetScannedNodesCount(); AppStats.ApplicationState = AppState.Scaning; Application.Current.Dispatcher.Invoke(() => GridSource.Clear()); GenerateRowsFromIpRangesAndArangeScanTasks(); CreateFileterColumnsList(); var requiredThreadsCount = (byte)Math.Min(GridSource.Count, Config.MaxThreads); var multiTask = new MultiThreadedTask(requiredThreadsCount); multiTask.Finished += MultiTask_Finished; multiTask.Begin(ScanProc); } }); }
private void CreateFileterColumnsList() { Application.Current.Dispatcher.Invoke(() => { FilterColumns.Clear(); FilterColumns.Add(new SelectableObject <string>("<all>")); foreach (var remoteParameter in Config.UserQuerySet) { if (RemoteParametersTypes[remoteParameter] == typeof(string)) { FilterColumns.Add(new SelectableObject <string>(remoteParameter)); } } }); }