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

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

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

Есть метод, который считывает данные с определенных юрлов. Но данные по этим адресам постоянно меняются, чтобы отследить изменения, надо по завершении выполнения данного метода, запускать его повторно, т.е. метод должен работать не прерывно. Как сделать, чтобы он работал не прерывно? Код ниже
Листинг программы
  1. private static void http()
  2. {
  3. var uris = new[] {
  4. new Uri( "http://" + "10.xx.24.xxx" + "/cgi/status.txt"),
  5. new Uri( "http://" + "10.xx.100.xxx" + "/cgi/status.txt"),
  6. };
  7. IEnumerable<IAsyncResult> asyncResults = uris
  8. .Select(uri => (HttpWebRequest)WebRequest.Create(uri))
  9. .Select(webRequest => webRequest.BeginGetResponse(null, webRequest));
  10. Console.WriteLine("Ожидаем завершения запросов.");
  11. WaitHandle[] handles = asyncResults.Select(asyncResult => asyncResult.AsyncWaitHandle).ToArray();
  12. WaitHandle.WaitAll(handles);
  13. Console.WriteLine("Получаем данные.");
  14. ParallelQuery<HTTPData> result = asyncResults
  15. .AsParallel()
  16. .WithDegreeOfParallelism(handles.Length)
  17. .AsUnordered()
  18. .Select(asyncResult =>
  19. {
  20. HTTPData httpData = new HTTPData();
  21. var httpWebRequest = (HttpWebRequest)asyncResult.AsyncState;
  22. HttpWebResponse response;
  23. try
  24. {
  25. response = (HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult);
  26. }
  27. catch (Exception e)
  28. {
  29. httpData.host = httpWebRequest.Address.Host;
  30. httpData.result = e.Message;
  31. return httpData;
  32. }
  33. Stream responseStream = response.GetResponseStream();
  34. if (responseStream == null)
  35. {
  36. httpData.host = httpWebRequest.Address.Host;
  37. httpData.result = "responseStream not available";
  38. return httpData;
  39. }
  40. using (var reader = new StreamReader(responseStream))
  41. {
  42. httpData.host = httpWebRequest.Address.Host;
  43. httpData.result = reader.ReadToEnd();
  44. return httpData;
  45. }
  46. });
  47. result.ForAll(s =>
  48. {
  49. Console.WriteLine("Host:" + s.host + "\n" + s.result );
  50. Console.WriteLine("----------------------------");
  51. });
  52. }
P.S.Также параллельно надо проверять, что сервер пингуется. Если пингуется, то только после это проверять юрлы
Почему то, если даже просто второй раз его вызвать, на второй итерации программа ни чего не делает, выводит только один результат по одному юрлу, второй теряется и больше ни чего не происходит. Программа просто работает, без вывода результатов

Решение задачи: «Непрерывное выполнение метода»

textual
Листинг программы
  1. void PingAndRun()
  2. {
  3.     var limiter = new AutoResetEvent(false);
  4.    
  5.     var pinger = new Ping();
  6.     pinger.PingCompleted += (s, a) =>
  7.     {
  8.         if (!a.Cancelled && a.Reply.Status == IPStatus.Success)
  9.         {
  10.             limiter.Set();
  11.         }
  12.     };
  13.  
  14.     while (true)
  15.     {
  16.         pinger.SendPingAsync("ya.ru");
  17.        
  18.         if (limiter.WaitOne(3000))
  19.         {
  20.             http();
  21.         }
  22.         else
  23.         {
  24.             pinger.SendAsyncCancel();
  25.         }
  26.     }
  27. }

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


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

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

13   голосов , оценка 3.615 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы