c#如何在可靠和不阻塞的UI中检查互联网连接

本文关键字:UI 检查 连接 互联网 | 更新日期: 2023-09-27 18:01:41

而以前我正在寻找一些可靠的方式来检查互联网连接,同时我希望它不会使我的应用程序无响应,我发现了像这样的代码的各种例子:

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无响应。

干杯m

编辑:

我想为这个代码是可从多个代码路径,最好作为一些静态类的静态方法。在某种程度上,作为后台工作人员确实会限制它。我将尝试单独的线程,看看它是否会带来我想要达到的效果。

我只是想得到所有发生的事情在调用这个简单的方法(延迟,所有其他操作等待方法完成),只是没有阻塞UI,所以当连接被检查应用程序正在等待,但不挂起

c#如何在可靠和不阻塞的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();
}