Создание независимого потока - C#

Узнай цену своей работы

Формулировка задачи:

Подписываюсь на событие и запускаю метод который в бесконечном цикле занимается проверкой.
Листинг программы
  1. monitoringServer = new Monitoring();
  2. monitoringServer.onMonitoringServer += new MonitoringServerEventHandler(monitoringServer_onMonitoringServer);
  3. monitoringServer.StartMonitoring(serverList);
  4. WindowLoad.SetStatus("Поиск сервера...");
  5. do
  6. {
  7. }
  8. while (!_loadMonitoringServer);
Все отлично работает, но вот в чем проблема. Программа не выходит из события по подписке monitoringServer_onMonitoringServer Он постоянно получает данные и обрабатывает их даже не доходя до цикла. Результат программа висит. Как сделать так, чтобы мониторинг работал параллельно и не влиял на работу программы? Если сделать так
Листинг программы
  1. Thread thStartMonitoringServer = new Thread(new ThreadStart(StartMonitoringServer));
  2. thStartMonitoringServer.Start();
То все запускается и работает, но в случаи проблемы происходит зависание основного потока и событие monitoringServer_onMonitoringServer уже не отрабатывает, следовательно теряет свою актуальность. Данное событие должно отрабатывать всегда. На то он и мониторинг.

Решение задачи: «Создание независимого потока»

textual
Листинг программы
  1.   public class Monitoring : IMonitoringServer
  2.     {  
  3.         static BlockingCollection<Server> queue = new BlockingCollection<Server>();
  4.         public event MonitoringServerEventHandler onMonitoringServer;
  5.  
  6.         private bool stopMonitoring;
  7.  
  8.  
  9.         public Monitoring()
  10.         {
  11.          }
  12.  
  13.   public void StartMonitoring(Dictionary<string, Server> monitoringList)
  14.         {
  15.             serverList = monitoringList;
  16.             // Создаем потоки , которые будут заниматься мониторингом
  17.             Task[] threads = new Task[monitoringList.Count];
  18.  
  19.             while (!stopMonitoring)
  20.             {
  21.                 Console.WriteLine("\n\n\n==== Старт задачи. ИТЕРАЦИЯ:{0} ====\n", count);
  22.                 queue = new BlockingCollection<Server>();
  23.  
  24.                 for (int i = 0; i < threads.Length; i++)
  25.                 {
  26.                     int num = i + 1;
  27.                     threads[i] = Task.Factory.StartNew(() => ProcessQueue("Thread " + num));
  28.                 }
  29.                 // Создаем очередь мониторинга серверов
  30.                 foreach (KeyValuePair<string, Server> entry in serverList.ToArray())
  31.                 {
  32.                     queue.Add(entry.Value);
  33.  
  34.                 }
  35.  
  36.                 // Эта строчка заставит все слушающие потоки разблокироваться, когда в очереди не останется элементов.
  37.                 // На деле ее надо добавлять при завершении работы приложения - чтобы слушающие потоки не висели бесконечно.
  38.                 queue.CompleteAdding();
  39.  
  40.                 // Ждем окончания работы всех потоков
  41.                 Task.WaitAll(threads);
  42.                 queue.Dispose();
  43.                 Console.WriteLine("\n\n\n==== Задачи завершины. ИТЕРАЦИЯ:{0} ====\n", count);
  44.                 count++;
  45.  
  46.                 if (onMonitoringServer != null)
  47.                 {
  48.                     //var handler = onMonitoringServer;
  49.                     //var ud = serverList;
  50.                     MonitoringServerEventArgs args = new MonitoringServerEventArgs(serverList);
  51.                     //ThreadPool.QueueUserWorkItem((st) => handler(this, args));
  52.                     onMonitoringServer(serverList, args);
  53.                 }
  54.  
  55.                 ClearServerList();
  56.                 Thread.Sleep(1000);
  57.             }
  58.            
  59.         }
  60. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.3 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы