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

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

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

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

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

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);
            }
            
        }
}

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


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

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

10   голосов , оценка 4.3 из 5
Похожие ответы