У меня есть массив с несколькими IP-адресами.
У меня есть рабочий метод для ping для IP:
public static bool PingHost(string nameOrAddress)
{
if ( nameOrAddress == null || nameOrAddress == string.Empty)
{
return false;
}
bool pingable = false;
Ping pinger = new Ping();
try
{
PingReply reply = pinger.Send(nameOrAddress);
pingable = reply.Status == IPStatus.Success;
}
catch (PingException ex)
{
return false;
}
return pingable;
}
Я использую backgroundworker (используя.Net 3.5) для запуска пинга. Когда он будет завершен, я изменяю GUI моей формы. Все работает отлично, когда я звоню на один IP-адрес. Но то, что я хочу сделать, - это запустить весь мой IP-адрес и мгновенно обновить форму после завершения одного IP-адреса. Таким образом, я должен уметь видеть результат первого IP, пока другие все еще пингируют.
private void backgroundWorkerPingHost_DoWork(object sender, DoWorkEventArgs e)
{
hostIsPingable = PingHost("www.google.be");
}
private void backgroundWorkerPingHost_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
}
else if (e.Error != null)
{
MessageBox.Show("error:" + e.Error.Message);
HtmlElement htmlDIV = webbSPPagina.Document.GetElementById("isPingable");
htmlDIV.Style = "width: 20px; height: 20px; background: red; border: solid black 1px;";
}
else
{
if (hostIsPingable)
{
HtmlElement htmlDIV = webbSPPagina.Document.GetElementById("isPingable");
htmlDIV.Style = "width: 20px; height: 20px; background: green; border: solid black 1px;";
}
else
{
HtmlElement htmlDIV = webbSPPagina.Document.GetElementById("isPingable");
htmlDIV.Style = "width: 20px; height: 20px; background: red; border: solid black 1px;";
}
}
}
Установите backgroundWorkerPingHost.WorkerReportsProgress = True
чтобы вы могли сообщать о прогрессе в поток пользовательского интерфейса.
private void backgroundWorkerPingHost_DoWork(object sender, DoWorkEventArgs e)
{
foreach (...) // a loop, since you said you're doing this multiple times
{
var hostIsPingable = PingHost("www.google.be");
// Each time you get a response, report the result to the UI thread
((BackgroundWorker)sender).ReportProgress(0, hostIsPingable);
}
}
private void backgroundWorkerPingHost_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// Notified by the DoWork event. Get the result and do something with it
var hostIsPingable = (bool)e.UserState;
if (hostIsPingable)
{
HtmlElement htmlDIV = webbSPPagina.Document.GetElementById("isPingable");
htmlDIV.Style = "width: 20px; height: 20px; background: green; border: solid black 1px;";
}
else
{
HtmlElement htmlDIV = webbSPPagina.Document.GetElementById("isPingable");
htmlDIV.Style = "width: 20px; height: 20px; background: red; border: solid black 1px;";
}
}
private void backgroundWorkerPingHost_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
return;
// Leave stuff in here that you only want to do once when the worker ends
if (e.Error != null)
{
MessageBox.Show("error:" + e.Error.Message);
HtmlElement htmlDIV = webbSPPagina.Document.GetElementById("isPingable");
htmlDIV.Style = "width: 20px; height: 20px; background: red; border: solid black 1px;";
return;
}
}
ProgressChanged
которое является частьюBackgroundWorker
.