簡體   English   中英

C#如何在可實現且不阻止UI的情況下檢查Internet連接?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM