Создание независимого потока - C#
Формулировка задачи:
Подписываюсь на событие и запускаю метод который в бесконечном цикле занимается проверкой.
Все отлично работает, но вот в чем проблема.
Программа не выходит из события по подписке monitoringServer_onMonitoringServer
Он постоянно получает данные и обрабатывает их даже не доходя до цикла. Результат программа висит.
Как сделать так, чтобы мониторинг работал параллельно и не влиял на работу программы?
Если сделать так
То все запускается и работает, но в случаи проблемы происходит зависание основного потока и событие monitoringServer_onMonitoringServer уже не отрабатывает, следовательно теряет свою актуальность. Данное событие должно отрабатывать всегда. На то он и мониторинг.
monitoringServer = new Monitoring(); monitoringServer.onMonitoringServer += new MonitoringServerEventHandler(monitoringServer_onMonitoringServer); monitoringServer.StartMonitoring(serverList); WindowLoad.SetStatus("Поиск сервера..."); do { } while (!_loadMonitoringServer);
Thread thStartMonitoringServer = new Thread(new ThreadStart(StartMonitoringServer)); thStartMonitoringServer.Start();
Решение задачи: «Создание независимого потока»
textual
Листинг программы
public class Monitoring : IMonitoringServer { static BlockingCollection<Server> queue = new BlockingCollection<Server>(); public event MonitoringServerEventHandler onMonitoringServer; private bool stopMonitoring; public Monitoring() { } public void StartMonitoring(Dictionary<string, Server> monitoringList) { serverList = monitoringList; // Создаем потоки , которые будут заниматься мониторингом Task[] threads = new Task[monitoringList.Count]; while (!stopMonitoring) { Console.WriteLine("\n\n\n==== Старт задачи. ИТЕРАЦИЯ:{0} ====\n", count); queue = new BlockingCollection<Server>(); for (int i = 0; i < threads.Length; i++) { int num = i + 1; threads[i] = Task.Factory.StartNew(() => ProcessQueue("Thread " + num)); } // Создаем очередь мониторинга серверов foreach (KeyValuePair<string, Server> entry in serverList.ToArray()) { queue.Add(entry.Value); } // Эта строчка заставит все слушающие потоки разблокироваться, когда в очереди не останется элементов. // На деле ее надо добавлять при завершении работы приложения - чтобы слушающие потоки не висели бесконечно. queue.CompleteAdding(); // Ждем окончания работы всех потоков Task.WaitAll(threads); queue.Dispose(); Console.WriteLine("\n\n\n==== Задачи завершины. ИТЕРАЦИЯ:{0} ====\n", count); count++; if (onMonitoringServer != null) { //var handler = onMonitoringServer; //var ud = serverList; MonitoringServerEventArgs args = new MonitoringServerEventArgs(serverList); //ThreadPool.QueueUserWorkItem((st) => handler(this, args)); onMonitoringServer(serverList, args); } ClearServerList(); Thread.Sleep(1000); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д