Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
dima-z04
0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 48
1

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

03.02.2017, 13:48. Просмотров 331. Ответов 6
Метки нет (Все метки)

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

C#
1
2
3
4
5
6
7
8
9
monitoringServer = new Monitoring();
            monitoringServer.onMonitoringServer += new MonitoringServerEventHandler(monitoringServer_onMonitoringServer);
            monitoringServer.StartMonitoring(serverList);
 
            WindowLoad.SetStatus("Поиск сервера...");
            do
            {
            }
            while (!_loadMonitoringServer);
Все отлично работает, но вот в чем проблема.

Программа не выходит из события по подписке monitoringServer_onMonitoringServer
Он постоянно получает данные и обрабатывает их даже не доходя до цикла. Результат программа висит.

Как сделать так, чтобы мониторинг работал параллельно и не влиял на работу программы?

Если сделать так
C#
1
2
Thread thStartMonitoringServer = new Thread(new ThreadStart(StartMonitoringServer));
thStartMonitoringServer.Start();
То все запускается и работает, но в случаи проблемы происходит зависание основного потока и событие monitoringServer_onMonitoringServer уже не отрабатывает, следовательно теряет свою актуальность. Данное событие должно отрабатывать всегда. На то он и мониторинг.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2017, 13:48
Ответы с готовыми решениями:

Запуск независимого потока
Здравствуйте! Очень интересует вопрос про потоки. Возможно ли создать потом,...

Создание независимого таймера
Доброго времени суток, господа. В общих чертах мне нужно создать таймер. Как...

Создание независимого exe файла
Всем привет! Я создал небольшое оконное приложение на c#. Хотел узнать можно ли...

Создание потока с номером
Здравствуйте. Можно ли при создании потока в "myThread" передать через...

Создание нового потока Thread
Привет всем. Пытаюсь по клику на кнопку создать новый поток и чтобы внутри...

6
OwenGlendower
Супер-модератор
Эксперт .NET
9678 / 8424 / 3609
Регистрация: 17.03.2014
Сообщений: 16,864
Записей в блоге: 1
03.02.2017, 15:01 2
dima-z04, давай посмотрим код класса Monitoring
0
dima-z04
0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 48
03.02.2017, 16:48  [ТС] 3
Вот
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
  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);
            }
            
        }
}
Добавлено через 23 секунды
Вот
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
  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);
            }
            
        }
}
0
OwenGlendower
Супер-модератор
Эксперт .NET
9678 / 8424 / 3609
Регистрация: 17.03.2014
Сообщений: 16,864
Записей в блоге: 1
03.02.2017, 17:17 4
dima-z04, метод StartMonitoring крутится в цикле. Разумеется при этом код который идет после его вызова не будет выполняться. Событие здесь ни при чем.
0
EveKS
457 / 404 / 166
Регистрация: 19.04.2016
Сообщений: 1,605
Завершенные тесты: 7
03.02.2017, 21:37 5
А всего-то нужно сделать всё это асинхронно... И пусть себе крутится
0
dima-z04
0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 48
06.02.2017, 09:09  [ТС] 6
А как это сделать асинхронно? Ключевые слова async await у меня не поддерживаются. Буду рад подсказки или примеру. Спасибо
0
EveKS
457 / 404 / 166
Регистрация: 19.04.2016
Сообщений: 1,605
Завершенные тесты: 7
06.02.2017, 12:26 7
dima-z04, Task.Factory.FromAsync

Стоит почитать про интерфейс IAsyncResult

И как вариант, возможно стоит выделить отдельный домен. System.AppDomain
0
06.02.2017, 12:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2017, 12:26

EventHandler создание события из другого потока
Доброго времени суток. Вопрос заключается в следующем: Есть Класс с циклом в...

Создание потока записи данных (FileStream)
создание патока записи данных ( FileStream = new...

Создание потока таким образом, чтобы файл был доступен другим программам
Здравствуйте Я создаю поток для записи в бинарный файл: using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru