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

Непрерывное выполнение метода

24.01.2017, 16:06. Просмотров 372. Ответов 4
Метки нет (Все метки)

Есть метод, который считывает данные с определенных юрлов. Но данные по этим адресам постоянно меняются, чтобы отследить изменения, надо по завершении выполнения данного метода, запускать его повторно, т.е. метод должен работать не прерывно. Как сделать, чтобы он работал не прерывно? Код ниже

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
private static void http()
        
            {
                var uris = new[] {
                new Uri( "http://" + "10.xx.24.xxx" + "/cgi/status.txt"),
                new Uri(  "http://" + "10.xx.100.xxx" + "/cgi/status.txt"),
            };
 
                IEnumerable<IAsyncResult> asyncResults = uris
                    .Select(uri => (HttpWebRequest)WebRequest.Create(uri))
                    .Select(webRequest => webRequest.BeginGetResponse(null, webRequest));
 
                Console.WriteLine("Ожидаем завершения запросов.");
 
                WaitHandle[] handles = asyncResults.Select(asyncResult => asyncResult.AsyncWaitHandle).ToArray();
                WaitHandle.WaitAll(handles);
 
                Console.WriteLine("Получаем данные.");
               
                ParallelQuery<HTTPData> result = asyncResults
                    .AsParallel()
                    .WithDegreeOfParallelism(handles.Length)
                    .AsUnordered()
                    .Select(asyncResult =>
                    {
                        HTTPData httpData = new HTTPData();
                        var httpWebRequest = (HttpWebRequest)asyncResult.AsyncState;
                        HttpWebResponse response;
                        try
                        {
                            response = (HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult);
                        }
                        catch (Exception e)
                        {
                            httpData.host = httpWebRequest.Address.Host;
                            httpData.result = e.Message;
                            return httpData;
                        }
                        Stream responseStream = response.GetResponseStream();
                        if (responseStream == null)
                        {
                            httpData.host = httpWebRequest.Address.Host;
                            httpData.result = "responseStream not available";
                            return httpData;
                        }
                        using (var reader = new StreamReader(responseStream))
                        {
                           
                            httpData.host = httpWebRequest.Address.Host;
                            httpData.result = reader.ReadToEnd();
                            return httpData;
                        }
                    });
 
                result.ForAll(s =>
                {
                    
                    Console.WriteLine("Host:" + s.host + "\n" + s.result );
                    Console.WriteLine("----------------------------");
                });
 
            }
P.S.Также параллельно надо проверять, что сервер пингуется. Если пингуется, то только после это проверять юрлы

Добавлено через 5 часов 40 минут
Почему то, если даже просто второй раз его вызвать, на второй итерации программа ни чего не делает, выводит только один результат по одному юрлу, второй теряется и больше ни чего не происходит. Программа просто работает, без вывода результатов
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2017, 16:06
Ответы с готовыми решениями:

Как из метода отправить переменную в другой метод и продолжить выполнение метода?
Здравствуйте, подскажите пожалуйста, как из метода отправить переменную в другой метод и продолжить...

Автоматическое выполнение метода
При инжекте dll в процесс должен выполнятся метод в этой dll. Где-то слышал, что такое возможно....

Прервать выполнение метода
Как прервать выполнение метода, если нет доступа к исходникам метода. Метод выполняется 1 мин,...

Проверить выполнение метода
Есть такой метод: public static Boolean sendSMS(String to, String text) В его теле, как вы уже...

4
TopLayer
895 / 651 / 318
Регистрация: 23.10.2016
Сообщений: 1,537
Завершенные тесты: 7
24.01.2017, 17:07 2
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
void PingAndRun()
{
    var limiter = new AutoResetEvent(false);
    
    var pinger = new Ping();
    pinger.PingCompleted += (s, a) =>
    {
        if (!a.Cancelled && a.Reply.Status == IPStatus.Success)
        {
            limiter.Set();
        }
    };
 
    while (true)
    {
        pinger.SendPingAsync("ya.ru");
        
        if (limiter.WaitOne(3000))
        {
            http();
        }
        else
        {
            pinger.SendAsyncCancel();
        }
    }
}
0
dima-z04
0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 55
24.01.2017, 17:51  [ТС] 3
Да, спасибо большое. То, что надо.

Но проблему с повторным запуском не решает.

При вызове http(), уже на второй итерации выводится:
Ожидаем завершения запросов.
Получаем данные.


И данных нет. Так и отображается черный экран. Есть подозрение, что кто-то чего-то не дожидается или не завершается до конца. Ни как понять не могу.
0
TopLayer
895 / 651 / 318
Регистрация: 23.10.2016
Сообщений: 1,537
Завершенные тесты: 7
24.01.2017, 18:00 4
Цитата Сообщение от dima-z04 Посмотреть сообщение
Есть подозрение, что кто-то чего-то не дожидается или не завершается до конца.
как насчёт подебажить?
0
dima-z04
0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 55
24.01.2017, 18:02  [ТС] 5
Сижу этим и занимаюсь )
Ни как не могу могу понять.
Похоже уже глаза замылил и очевидного не вижу
0
24.01.2017, 18:02
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2017, 18:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Выполнение метода несколько раз
Возможно ли? Создаем статический метод. В текстбокс вставляем число желаемых выполнений(ну т.е....

Выполнение метода в отдельном потоке
В моей программе есть метод авторизации на одном сайте, вызываю вот так:...

Выполнение метода в определённое время
Здравствуйте. Мне необходимо, чтобы некий метод выполнился в определённое время, на пример в...

Выполнение метода спустя 60 секунд
Добрый вечер! Не знаю как реализовать выполнение метода через 60 секунд, после выполнения условия....


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

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

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