[英]C# How to check internet connection in realiable and not block UI?
前一陣子我在尋找一種可行的檢查互聯網連接的方法,同時我希望它不會使我的應用程序無響應,我發現了許多類似此代碼的示例:
public static bool CheckForInternetConnection()
{
try
{
using (var client = new WebClient())
using (var stream = client.OpenRead("http://www.google.com"))
{
return true;
}
}
catch
{
return false;
}
}
使用WebClient ,但是這些解決方案的主要缺陷在於它們凍結了整個應用程序,並且由於我每隔幾分鍾進行一次連接測試,因此這種行為是非常不希望的。
我想要實現的是使那段代碼以一種可以執行的方式工作,但是它將使應用程序等待響應,同時又不會使UI無響應。
干杯
編輯:
我希望此代碼可從多個代碼路徑中獲取,最好作為某些靜態類的靜態方法使用。 作為后台工作人員這樣做確實在某種程度上限制了它。 我將嘗試使用單獨的線程,並查看它是否會帶來我想要實現的效果。
我只想獲取在調用上述簡單方法期間發生的所有事情(延遲,所有其他等待方法完成的操作),而沒有阻塞UI,因此在檢查連接時,應用正在等待但不會掛起
如果您不能使用BackgroundWorker並且目標是.NET 4.5,則可以將該方法包裝在Task中 。
public static Task<bool> CheckInternetConnectionAsync( )
{
return Task<bool>.Run( ( ) => {
try
{
using ( var client = new WebClient( ) )
using ( var stream = client.OpenRead( "http://www.google.com" ) )
{
return true;
}
}
catch
{
return false;
}
} );
}
每當您需要檢查互聯網連接時,都可以這樣做...
static async void CheckInternetConnection( )
{
//just an example how to read a value from Task
bool hasConnection = await CheckInternetConnectionAsync( );
}
您需要使用多線程在另一個線程上運行檢查,以免影響主應用程序。
Thread thread = new Thread(() => ConnectionCheck());
thread.Start();
...
public static void ConnectionCheck()
{
bool result = CheckForInternetConnection();
//Do something with result
}
在您的情況下,使用BackgroundWorker
可能更容易使用返回值。 您可以運行任務,將輸出存儲在Result
變量中,並在完成后使用它。
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync("Name");
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
bool result = (bool)e.Result;
//Do something with Result
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = CheckForInternetConnection();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.