Я не согласен с людьми, которые утверждают: «Какой смысл проверять подключение перед выполнением задачи, так как сразу после проверки соединение может быть потеряно».
Конечно, существует определенная степень неопределенности во многих задачах программирования, которые мы, как разработчики, берем на себя, но уменьшение этой неопределенности до уровня приемлемости является частью проблемы.
Недавно я столкнулся с этой проблемой при создании приложения, включающего функцию сопоставления, которая связана с онлайн-сервером плиток. Эта функция должна была быть отключена, если было отмечено отсутствие подключения к Интернету.
Некоторые ответы на этой странице были очень хорошими, но, тем не менее, вызывали много проблем с производительностью, таких как зависание, в основном в случае отсутствия подключения.
Вот решение, которое я в итоге использовал, с помощью некоторых из этих ответов и моих коллег:
// Insert this where check is required, in my case program start
ThreadPool.QueueUserWorkItem(CheckInternetConnectivity);
}
void CheckInternetConnectivity(object state)
{
if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
using (WebClient webClient = new WebClient())
{
webClient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.BypassCache);
webClient.Proxy = null;
webClient.OpenReadCompleted += webClient_OpenReadCompleted;
webClient.OpenReadAsync(new Uri("<url of choice here>"));
}
}
}
volatile bool internetAvailable = false; // boolean used elsewhere in code
void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
if (e.Error == null)
{
internetAvailable = true;
Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
{
// UI changes made here
}));
}
}