2011-11-29 9 views
5

mam ikonę w zasobniku, który wymaga, aby wyświetlić dwie ikony:C# gwintowania i odpytywania

  1. Jeśli nie ma połączenia z siecią, wyświetla zielone kółko ze znakiem wyboru
  2. Jeśli nie ma połączenia sieciowego, wyświetlane czerwone kółko z X

Więc co mam to:

using System.Net.NetworkInformation; 

bool isConnected = NetworkInterface.GetIsNetworkAvailable() 

więc jestem cienki Król rozpoczęciem nowego wątku lub przy wykorzystaniu postępu tle Pracownik ponieważ ikona w zasobniku jest NotifyIcon który jest składnikiem, więc nie mogę użyć:

Form.Invoke(delegate, object[]) 

aby zaktualizować właściwość ikona klasy NotifyIcon.

Moja dużym problemem jest proces odpytywania: Mógłbym napisać jakąś logikę, która robi:

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

ale widziałem kilka artykułów, które mówią mi się trzymać z dala od snu (1000). Nie mogę znaleźć tych artykułów, ponieważ ich nie dodałem do zakładek. Po prostu ciekawi mnie, dlaczego nie jest to dobry pomysł na sondowanie w wątku.

+2

Nie ma sensu spalanie coś tak drogie, jak na tego wątku. Po prostu użyj timera. –

+0

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

Odpowiedz

4

można zarejestrować zdarzenia na NetworkChange więc są powiadamiani o zmianie stanu:

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

W Twojej sytuacji całkowicie nie nadaje się do użycia metody Uśpienia.

Co obejrzałeś prawdopodobnie mówiąc tak, że lepiej użyć Reset Event - z pętli itp ...

+0

Nie ma powodu do sondowania tutaj, ponieważ istnieje już framework API który zapewnia zdarzenia, gdy zmienia się łączność sieciowa. –

0

Polling nie jest zawsze zła, ale to najlepiej unikać, jeśli to możliwe. Jeśli uruchomię aplikację, która jest odpytywana raz na sekundę, oznacza to, że raz na sekundę program planuje wykonać pracę z rdzeniem procesora, który wynosi 99,9999% bez operacji. Na pulpicie, który nie jest zbyt straszny, ale wyobraź sobie laptopa. Procesory tam starają się pracować w trybie bardzo niskiego poboru mocy, kiedy tylko jest to możliwe, więc dodatkowa praca procesora oznacza krótszy czas pracy baterii! Jest to powód, dla którego wiele platform mobilnych (iOS, Windows Phone 7 itp.) Blokuje arbitralne wątki w tle, ponieważ wiedzą, że ludzie będą je nadużywać.

W twoim przypadku jest łatwiejszy sposób: po prostu użyj System.Net.NetworkInformation.NetworkChange, który zapewnia zdarzenia, gdy zmienia się połączenie sieciowe. Nie wymaga się odpytywania!

Powiązane problemy