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

Правильна ли идея алгоритма и как ее правильно реализовать? - C#

26.01.2017, 11:14. Просмотров 185. Ответов 2
Метки нет (Все метки)

Правильна ли идея алгоритма и как ее правильно реализовать, чтобы программа не зависала и мониторинг работал в своем отдельном потоке и не влиял на программу, но передавал ей результаты. (программа считывает из инфо класса)

Есть информационный класс Сервер собирающий содержащий информацию о доступности сервера по ping, http и BD

В зависимости от количества серверов (например два) одновременно запускаются потоки для опроса каждого сервера действующие по следующему алгоритму

1. Проверяем доступность по ping, если доступен запускаем 2, если нет, в инфо класс пишем соответствующую инфу, выходим.
2. Если по ping доступен запускаем сразу не зависимо друг от друга асинхронно методы проверки по http и BD. Если по http не доступен делаем 3 попытки, чтобы убедиться что действительно не доступен записываем результаты в инфо класс.
3. Ждем завершения потоков, смотрим инфо класс и состояния серверов, обрабатываем данные, после чего запускаем опять опрос и так бесконечно.
http://www.cyberforum.ru/csharp-beginners/thread950000.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2017, 11:14
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Правильна ли идея алгоритма и как ее правильно реализовать? (C#):

Нужна идея как реализовать проверку ввода в клавиатурном тренажёре
Мне нужно реализовать банальный клавиатурный тренажёр для детей. Суть в чём -...

Как правильно реализовать IEnumerable<T>?
Пытаюсь научиться использовать интерфейс IEnumerable &lt;T&gt;. Компилятор тыкает,...

Как это правильно реализовать
Осуществить циклический сдвиг элементов квадратной матрицы размером М х N...

Как правильно реализовать бесконечный цикл?
Господа, такой вопрос. Я совсем ещё нуб в шарпе, да и в программировании...

IFormatProvider, как правильно реализовать IDisposable
Доброго вам времени суток. Прогоняю свой проект через FxCop(это вообще нужно?...

2
pycture
1168 / 557 / 84
Регистрация: 20.09.2012
Сообщений: 1,811
Завершенные тесты: 3
26.01.2017, 12:40 #2
потоки отстой
http://getakka.net/
1
dima-z04
0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 47
27.01.2017, 09:34  [ТС] #3
Лучший ответ Сообщение было отмечено dima-z04 как решение

Решение

По моему, не совсем корректный ответ ))

Добавлено через 20 часов 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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
public class TestMonitoring
    {
        private static ManualResetEvent allDone = new ManualResetEvent(false);
        public delegate void TestMonitoring(Server server);
        public event TestMonitoring onMonitoringServer;
 
        public void Test(Server server)
        {
 
          
                try
                {
 
                    Console.WriteLine("Проверка доступности по http...");
                    HttpWebRequest myHttpWebRequest1 = (HttpWebRequest)WebRequest.Create(server.URL);
 
                    // Create an instance of the RequestState and assign the previous myHttpWebRequest1
                    // object to it's request field.  
                    RequestState myRequestState = new RequestState();
                    myRequestState.request = myHttpWebRequest1;
 
 
 
                    // Start the asynchronous request.
                    IAsyncResult result =
                      (IAsyncResult)myHttpWebRequest1.BeginGetResponse(new AsyncCallback(RespCallback), myRequestState);
 
 
                    allDone.WaitOne();
 
                    if (myRequestState.response != null)
                    {
                        // Release the HttpWebResponse resource.
                        myRequestState.response.Close();
                    }
 
                    server.HTTP = Verfugbar.VerfГјgbar;
                    if (onMonitoringServer != null)
                    {
                        onMonitoringServer(server);
                    }
                    allDone.Reset();
 
 
                }
                catch (WebException e)
                {
                    Console.WriteLine("\nException raised!");
                    Console.WriteLine("\nMessage:{0}", e.Message);
                    Console.WriteLine("\nStatus:{0}", e.Status);
                    Console.WriteLine(".........................");
                }
                catch (Exception e)
                {
                    Console.WriteLine("\nException raised!");
                    Console.WriteLine("Source :{0} ", e.Source);
                    Console.WriteLine("Message :{0} ", e.Message);
                    Console.WriteLine("........................");
                }
 
        }
        private static void RespCallback(IAsyncResult asynchronousResult)
        {
            int BUFFER_SIZE = 10;
            try
            {
                // State of request is asynchronous.
                RequestState myRequestState = (RequestState)asynchronousResult.AsyncState;
                HttpWebRequest myHttpWebRequest2 = (HttpWebRequest)myRequestState.request;
                myRequestState.response = (HttpWebResponse)myHttpWebRequest2.EndGetResponse(asynchronousResult);
 
                // Read the response into a Stream object.
                Stream responseStream = myRequestState.response.GetResponseStream();
                myRequestState.responseStream = responseStream;
 
                // Begin the Reading of the contents of the HTML page and print it to the console.
                IAsyncResult asynchronousInputRead = responseStream.BeginRead(myRequestState.bufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
            }
            catch (WebException e)
            {
                Console.WriteLine("\nException raised!");
                Console.WriteLine("\nMessage:{0}", e.Message);
                Console.WriteLine("\nStatus:{0}", e.Status);
                allDone.Set();
            }
        }
        private static void ReadCallBack(IAsyncResult asyncResult)
        {
            int BUFFER_SIZE = 10;
            try
            {
 
                RequestState myRequestState = (RequestState)asyncResult.AsyncState;
                Stream responseStream = myRequestState.responseStream;
                int read = responseStream.EndRead(asyncResult);
                // Read the HTML page and then print it to the console.
                if (read > 0)
                {
                    myRequestState.requestData.Append(Encoding.ASCII.GetString(myRequestState.bufferRead, 0, read));
                    IAsyncResult asynchronousResult = responseStream.BeginRead(myRequestState.bufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
                }
                else
                {
                    Console.WriteLine("\nThe contents of the Html page are : ");
                    if (myRequestState.requestData.Length > 1)
                    {
                        string stringContent;
                        stringContent = myRequestState.requestData.ToString();
                        Console.WriteLine(stringContent);
                    }
                    Console.WriteLine("............................");
 
                    responseStream.Close();
                    allDone.Set();
 
                }
 
            }
            catch (WebException e)
            {
                Console.WriteLine("\nException raised!");
                Console.WriteLine("\nMessage:{0}", e.Message);
                Console.WriteLine("\nStatus:{0}", e.Status);
 
            }
 
        }
 
 
       public  void PingAndRun(Server server)
        {
            var limiter = new AutoResetEvent(false);
            Console.WriteLine("Проверка доступности по IP");
            var pinger = new Ping();
            pinger.PingCompleted += (s, a) =>
            {
                if (!a.Cancelled && a.Reply.Status == IPStatus.Success)
                {
                    Console.WriteLine("Сервер доступен по IP");
                    limiter.Set();
                }
            };
 
            while (true)
            {
                pinger.SendAsync(server.IP, limiter);
 
                if (limiter.WaitOne(3000))
                {
                    Console.WriteLine("Запуск потока для сервера:" + server.IP + "\n------------------");
                    Parallel.Invoke(() => { Test(server); }, ConnertBD);
                    Console.WriteLine("\nОкончание потока\n----------------------------------\n");
                    //Заполняем информационный класс
                    //...
                }
                else
                {
                    pinger.SendAsyncCancel();
                    Console.WriteLine("Сервер не доступен по IP!");
                }
            }
        }
 
        private void ConnertBD()
        {
            Console.WriteLine("Проверка доступности БД...");
            using (var mySQLCon = new MySqlConnection("server=10.77.24.252;port=63306;database=dozor2;user=dozor2;password=lohchoshob;charset=cp1251")
            )
            {
                try
                {
                    mySQLCon.Open();
                    var temp = mySQLCon.State.ToString();
                    if (temp == "Open")
                    {
                        Console.WriteLine("БД доступно");
                    }
                    else
                    {
                        Console.WriteLine("БД не доступна");
                    }
 
                    mySQLCon.Close();
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            Console.WriteLine("Окончание проверки доступности БД...");
        }
    }

В Main()
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
            Thread test1 = new Thread(S1);
            Thread test2 = new Thread(S2);
            test1.Start(); 
            test2.Start();
.......
static void test_monitoring(Server server)
        {
            throw new NotImplementedException();
        }
 
 
 
        static void S1()
        {
            TestMonitoring test = new TestMonitoring();
            Server server = new Server();
            server.IP = "10.xx.24.xxx";
            server.URL = "http://" + "10.xx.24.xxx" + "/cgi/status.txt";
            test.onMonitoringServer += new TestMonitoring.TestMonitoring(test_monitoring);
            test.PingAndRun(server);
        }
 
        static void S2()
        {
            TestMonitoring test2 = new TestMonitoring();
            Server server2 = new Server();
            server2.IP = "10.xx.100.xxx";
            server2.URL = "http://" + "10.xx.100.xxx" + "/cgi/status.txt";
            test2.onMonitoringServer += new TestMonitoring.TestMonitoring(test_monitoring);
            test2.PingAndRun(server2);
        }
И 2 вопрос, как сделать чтобы в случает ошибки при получении данных по http, сделать еще три попытки, только после этого делать заключение что действительно не доступен по http.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2017, 09:34
Привет! Вот еще темы с решениями:

Как правильно реализовать Интернет-радио?
Пытаюсь сделать проигрыватель онлайн радио на c#. Использую WMP. Подскажите...

Как правильно реализовать сортировку массива
Подскажите пожалуйста, как правильно реализовать сортировку? array.sort()...

Как правильно реализовать добавление данных в текстовый файл
Друзья, вопрос в шапке. Я делаю следующим образом //Создают массив для...

Как правильно реализовать возвращение значения из метода и передачу аргументов?
Как правильно реализовать возвращение значения из метода и передачу аргументов?...


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

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

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