Ping средствами c#

Пылесос

День добрый.Получаю все данные что нужны по нажатию кнопки:pingSender.SendAsync(adress, 1000, data, options, resetEvent);Подскажите пожалуйста, как это реализовать, чтобы постоянно получать данные - по аналогии с ping .... -t?Нужно сделать некий монитор.Вот код:
private void btnPing_Click(object sender, EventArgs e)
 {
 SendPing(IPAddress.Parse(IPadres), 1000); 
 }



 private void SendPing(IPAddress txtIP, int timeOut)
 {
 using (System.Net.NetworkInformation.Ping pingSender = new System.Net.NetworkInformation.Ping())
 {
 pingSender.PingCompleted += new PingCompletedEventHandler(pingSender_Complete);

 byte[] packetData = Encoding.ASCII.GetBytes("................................");
 PingOptions packetOptions = new PingOptions(255, false);

 pingSender.SendAsync(txtIP, timeOut, packetData, packetOptions, resetEvent);
 pingSender.Dispose();
 }
 }

 private void pingSender_Complete(object sender, PingCompletedEventArgs e)
 {
 if (pingResponse.Status == IPStatus.Success)
 {
 IPHostEntry hostAdr = Dns.GetHostEntry(pingResponse.Address);

 sResult = string.Format("{0} {1} {6}: {2}, byte={3}, время={5} мс TTL = {4}",
 DateTime.Now.ToLongTimeString(),
 pingResponse.Address,
 pingResponse.Status,
 "32",
 pingResponse.Options.Ttl,
 pingResponse.RoundtripTime,
 hostAdr.HostName);
 MessageBox.Show(sResult, "Сообщение"));
 }
 }
9 ответов

Пылесос

Пылесос,обернуть в условный цикл типа while, ваш КО.


Пылесос

Если вы используйте Using, то строкаpingSender.Dispose();является избыточной, а в частных случаях может приводить к ошибке, так как вы высвобождаете ресурсы 2 раза подряд, перед выходом из блока Using и при выходе из него. Если класс написан рукожопом, то при повторном Dispose могут и исключения получить


Пылесос

Если класс написан рукожопом, то при повторном Dispose могут и исключения получить


Пылесос

Ну вопрос то не в этом, а в том, как в цикле пинговать например 100 раз подряд с задержкой в 2 секунды скажем, и при этом чтобы была нормальная перерисовка формы с обновлением данных


Пылесос

Пылесос,Можно таймер использовать


Пылесос

Пылесос,Можно таймер использовать
Сделал по таймеру, стало лучше, однако все равно подвисает форма. Подскажите как сделать чтобы она не зависала?


Пылесос

Сделал по таймеру, стало лучше, однако все равно подвисает форма. Подскажите как сделать чтобы она не зависала?
Почему бы не сделать пингобомбёжку в BackgroundWorkere?


Пылесос

using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PingExample
{
 public partial class Form1 : Form
 {
 private Timer _pingTimer;
 private IPAddress _ipAddress;

 public Form1()
 {
 InitializeComponent();
 _pingTimer = new Timer { Interval = 2000 };
 _pingTimer.Tick += Timer_Tick;

 }

 private void UpdateControls()
 {
 IpAddress.Enabled = !_pingTimer.Enabled;
 Start.Enabled = !_pingTimer.Enabled;
 Stop.Enabled = _pingTimer.Enabled;
 }

 private void Start_Click(object sender, EventArgs e)
 {
 _pingTimer.Start();
 _ipAddress = IPAddress.Parse(IpAddress.Text);
 UpdateControls();
 }

 private void Stop_Click(object sender, EventArgs e)
 {
 _pingTimer.Stop();
 UpdateControls();
 }

 private async void Timer_Tick(object sender, EventArgs e)
 {
 await SendPing(_ipAddress, 1000);
 }


 private async Task SendPing(IPAddress txtIP, int timeOut)
 {
 using (Ping pingSender = new Ping())
 {
 byte[] packetData = Encoding.ASCII.GetBytes("................................");
 PingOptions packetOptions = new PingOptions(255, false);
 var result = await pingSender.SendPingAsync(txtIP, timeOut, packetData, packetOptions);
 Status.Text = result.Status.ToString();
 }
 }
 }
}
сделайте нормально через async\await, как то так примерно


Пылесос

Всем спасибо