Note : En réponse à votre solution originale
NetworkChange.NetworkAvailabilityChanged
fonctionne bien, mais il y a un certain nombre d'inconvénients : 1) il ne vous indique pas si vous avez Internet, il vous dit seulement si au moins une carte réseau non rebouclée adaptateur réseau non bouclé qui fonctionne, et 2) il y a souvent des adaptateurs réseau adaptateurs réseau supplémentaires installés pour diverses raisons et qui laissent le système le système dans un état "réseau disponible", même lorsque votre adaptateur principal principal connecté à Internet est désactivé/non disponible - grâce à Peter Duniho
La mise en réseau ne se résume pas à votre routeur ou à votre carte réseau, mais concerne tous les points d'accès à l'endroit où vous essayez de vous connecter à tout moment. La méthode la plus simple et la plus fiable consiste à envoyer un ping à une source bien connue comme Google, ou à utiliser une sorte de battement de cœur vers l'un de vos services Internet.
La raison pour laquelle cette méthode est la seule fiable est que de nombreux problèmes de connectivité peuvent survenir entre vous et le monde extérieur. Même les grands fournisseurs de services peuvent tomber en panne.
Donc un IMCP
ping vers un serveur connu comme Google, ou en appelant OpenRead
sur un WebClient
sont deux approches valables. Ces appels ne sont pas coûteux en comparaison et peuvent être intégrés dans une minuterie légère ou une tâche continue.
En ce qui concerne vos commentaires, vous pouvez probablement signaler un événement personnalisé pour indiquer la perte du réseau après un certain nombre d'échecs, par sécurité.
Pour répondre à votre question
Mais je crains que le ping toutes les 2 secondes consomme trop de ressources ou de puisse créer des problèmes de connexion à Internet.
Les deux méthodes sont très peu coûteuses en termes de CPU et de trafic réseau, les ressources utilisées doivent être minimales.
Note : Assurez-vous simplement que vous faites un ping ou que vous vous connectez à un serveur à haute disponibilité, cela permettre de telles manigances et ne pas simplement vous bloquer.
Exemple de ping
using System.Net.NetworkInformation;
// Implementation
using (var ping = new Ping())
{
var reply = ping.Send("www.google.com");
if (reply != null && reply.Status != IPStatus.Success)
{
// Raise an event
// you might want to check for consistent failures
// before signalling a the Internet is down
}
}
// Or if you wanted to get fancy ping multiple sources
private async Task<List<PingReply>> PingAsync(List<string> listOfIPs)
{
Ping pingSender = new Ping();
var tasks = listOfIPs.Select(ip => pingSender.SendPingAsync(ip, 2000));
var results = await Task.WhenAll(tasks);
return results.ToList();
}
Exemple de connexion
using System.Net;
// Implementation
try
{
using (WebClient client = new WebClient())
{
using (client.OpenRead("http://www.google.com/"))
{
// success
}
}
}
catch
{
// Raise an event
// you might want to check for consistent failures
// before signalling the Internet is down
}
Note : Ces deux méthodes ont un async
qui renverra une Task
et peut être attendue pour un Programmation asynchrone modèle mieux adapté aux tâches liées à l'IO
Ressources
Méthode Ping.Send
Méthode Ping.SendAsync
Méthode WebClient.OpenRead
Méthode WebClient.OpenReadAsync