2011-11-29 22 views
5

mi hanno un'icona nella barra che ha bisogno di visualizzare due icone:C# threading e sondaggi

  1. Se non c'è la connettività di rete, visualizzare un cerchio verde con un segno di spunta
  2. Se non c'è connettività di rete, visualizzare un cerchio rosso con una X

Quindi quello che ho è:

using System.Net.NetworkInformation; 

bool isConnected = NetworkInterface.GetIsNetworkAvailable() 

Quindi sono sottili re di iniziare un nuovo thread o utilizzando il fondo di avanzamento dei lavoratori perché l'icona della barra è un NotifyIcon che è un componente in modo da non posso usare:

Form.Invoke(delegate, object[]) 

per aggiornare la proprietà dell'icona della classe NotifyIcon.

La mia grande preoccupazione è il processo di polling: Potrei scrivere una logica che fa:

while (true) 
{ 
    System.Threading.Thread.Sleep(1000); 
    isConnected = NetworkInterface.GetIsNetworkAvailable(); 
    if (isConnected) 
     notifyIcon.Icon = "ConnectedIcon.ico"; 
    else 
     notifyIcon.Icon = "DisconnectedIcon.ico"; 
} 

ma ho visto un paio di articoli che mi dicono di stare lontano da sonno (1000). Non riesco a trovare quegli articoli dal momento che non li ho segnalati. Sono solo curioso di sapere perché non è una buona idea per il polling in una discussione.

+2

Non ha molto senso a bruciare qualcosa di costoso come un thread su questo. Basta usare un timer. –

+0

Si prega di consultare http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts –

risposta

4

È possibile registrare un evento su NetworkChange in modo che siano in fase di notifica quando lo stato cambia:

NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged); 

void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e) 
{ 
    if (e.IsAvailable) { 
     Console.WriteLine("Network Available"); 
    } else { 
     Console.WriteLine("Network Unavailable"); 
    } 
} 
1

Nella tua situazione è assolutamente bene usare il metodo Sleep.

Quello che avete visto è stato probabilmente dicendo così il suo meglio usare un Reset Event - da loop ecc ...

+0

Non c'è motivo di sondare qui, in quanto esiste già un'API framework che fornisce eventi quando la connettività di rete cambia. –

0

polling non è sempre male, ma è meglio evitare, se possibile. Se eseguo la tua applicazione che esegue il polling una volta al secondo, significa che una volta al secondo il tuo programma viene programmato per funzionare su un core della CPU che al 99.9999% diventerà un no-op. Su un desktop che non è troppo terribile, ma immagina un laptop. Le CPU lì provano a funzionare in modalità di potenza molto bassa ogni volta che è possibile, quindi un ulteriore lavoro della CPU comporta una minore durata della batteria! Questo è il motivo per cui molte piattaforme mobili (iOS, Windows Phone 7, ecc.) Vietano thread di background arbitrari perché sanno che le persone li abuseranno.

Nel tuo caso, c'è un modo più semplice: basta usare System.Net.NetworkInformation.NetworkChange che fornisce eventi per quando la connettività di rete cambia. Nessun sondaggio richiesto!