Создание независимого потока - 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);
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д