Добрый день. Помогите мне, пожалуйста, как я могу остановить метод SendPingAsync здесь, я попробовал SendAsyncCancel, но он останавливает только один поток, мне нужно отменить все нити pong.Стоп Ping.SendAsync нажатием кнопки WPF
private void refreshbtn_Click(object sender, EventArgs e)
{
if (tokenSource != null) //check if its even initialized or not
tokenSource.Cancel();
lstNetworks.Items.Clear();
string gate_ip = NetworkGateway();
//Extracting and pinging all other ip's.
string[] array = gate_ip.Split('.');
for (int i = 1; i <= 255; i++)
{
string ping_var = array[0] + "." + array[1] + "." + array[2] + "." + i;
//time in milliseconds
Ping(ping_var, 1, 4000);
}
}
public void Ping(string host, int attempts, int timeout)
{
tokenSource = new CancellationTokenSource();
Task.Factory.StartNew(() =>
{
try
{
System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
ping.PingCompleted += new PingCompletedEventHandler(PingCompletedCallback);
ping.SendAsync(host, timeout, host);
}
catch
{
// Do nothing and let it try again until the attempts are exausted.
// Exceptions are thrown for normal ping failurs like address lookup
// failed. For this reason we are supressing errors.
}
}, tokenSource.Token);
}
private void PingCompletedCallback(object sender, PingCompletedEventArgs e)
{
// If an error occurred, display the exception to the user.
if (e.Reply.Status == IPStatus.Success)
{
string hostName = GetHostName(e.Reply.Address.ToString());
string macAdress = GetMacAddress(e.Reply.Address.ToString());
if (!Dispatcher.CheckAccess())
{
Dispatcher.Invoke(new Action(() =>
{
lstNetworks.Items.Add(new InfoItem() { IP = e.Reply.Address.ToString(), MAC = macAdress, HOST = hostName });
lstNetworks.Items.SortDescriptions.Add(new SortDescription("IP", ListSortDirection.Ascending));
}));
}
}
else {
//Console.WriteLine(String.Concat("Non-active IP: ", e.Reply.Address.ToString()))
}
}
И каждый раз, когда я нажимаю кнопку обновления, я должен начать новую операцию ping. В моем случае останавливается только одна пинговая нить, но остальные продолжают работать.
UPDATE
Я попытался, как вы написали, когда я снова нажмите кнопку обновления моего приложение зависает, пока все потоки не остановятся (30 сек). Но когда приложение размораживает результат, тот же самый, все пакеты ping, которые I SendAsync ранее добавляются с новыми пакетами SensAsync, которые я отправил во второй раз. Мне нужно остановить не только поток, но и поток SendAsync. Существует метод SendAsyncCancel, но как я могу назвать его в то же время, когда мигает токен отмены?
Я пробовал, как вы написали, когда я снова нажимаю кнопку обновления, мое приложение зависает, пока все потоки не остановятся (30 секунд). Но когда приложение размораживает результат, тот же самый, все пакеты ping, которые I SendAsync ранее добавляются с новыми пакетами SensAsync, которые я отправил во второй раз. Мне нужно остановить не только поток, но и поток SendAsync. Существует метод SendAsyncCancel, но как я могу назвать его в то же время, когда мигает токен отмены? –
См. Обновление. Я добавил код, чтобы он не блокировал поток пользовательского интерфейса и не добавлял использование SendAsyncCancel –
. Есть некоторые проблемы. Я добавил ваш код, но есть компиляция Ошибка в ожидании Task.WaitAll (tasks.ToArray(), tokenSource.Token); - Не могу дождаться void –