Создание независимого потока - 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);
}
}
}