Ping Async C #: non funziona da un Threading.Timer

Spero di poterlo spiegare correttamente. Sto lavorando a un progetto che esegue più di 6000 ping simultanei asincroni ogni X minuti. Se provo a eseguire il componente da un pulsante su un modulo di Windows funziona. Ma se parti da un “Threading.Timer” ha problemi. A volte l’applicazione rimane bloccata in attesa di risposte ai ping e talvolta genera un’eccezione NullReferenceException quando si accede a una variabile che non può essere nullo. Ma se eseguito da un pulsante su un modulo di richiesta utente funziona correttamente.

Spero che qualcuno possa aiutarmi.

using System.Net.NetworkInformation; using System.Threading; 

Ad una prima ipotesi direi che fai alcuni aggiornamenti alla GUI della tua class. A causa del fatto che tutto funziona bene su un pulsante, l’attività viene eseguita all’interno del thread della GUI e può accedere a tutto ciò senza problemi. Se si esternalizza l’attività in una propria discussione, non si ha accesso diretto alla GUI.

Per risolvere questo problema è ansible racchiudere le chiamate GUI in una chiamata (Begin)Invoke() (in questo articolo è ansible trovare un approfondimento su questi comandi). Per renderlo un po ‘più semplice, puoi anche utilizzare uno di questi metodi di estensione:

 public static class ControlExtensions { public static void InvokeIfRequired(this Control c, Action action) { if (c.InvokeRequired) { c.Invoke(new Action(() => action(c))); } else { action(c); } } public static void BeginInvokeIfRequired(this Control c, Action action) { if (c.InvokeRequired) { c.BeginInvoke(new Action(() => action(c))); } else { action(c); } } } 

L’utilizzo sarebbe:

 myTextBox.InvokeIfRequired((ctrl) => ctrl.Text == "SomeNewText"); 

Hai provato a usare diversi BackgroundWorker invece di un Timer?

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

Grazie a tutti per il vostro aiuto! Ho trovato la soluzione (per il tempo impiegato). Tutto quello che ho fatto è stato cambiare il modo in cui distruggi gli oggetti “ping” per aver ricevuto il tuo replay. Ora distruggi ogni object “ping” nel metodo “PingResult” usando il parametro “mittente” (riferimento al ping) come segue:

 ((Ping)sender).PingCompleted -= PingResult; ((IDisposable)sender).Dispose(); 

Questo funziona per me. Spero che aiuti gli altri.

Un saluto e grazie mille per tutto!