【问题标题】:C# How to check internet connection in realiable and not block UI?C#如何检查互联网连接而不阻止用户界面?
【发布时间】:2014-05-04 15:54:46
【问题描述】:

之前我正在寻找一些检查互联网连接的可行方法,同时我希望它不会使我的应用程序反应迟钝,我发现了像这样的代码的各种示例:

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# .net connection


【解决方案1】:

如果您不能使用 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( );
        }

【讨论】:

  • 看来这正是我想要的,谢谢!
【解决方案2】:

您需要使用多线程在另一个线程上运行检查,以免干扰您的主应用程序。

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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2013-02-02
    相关资源
    最近更新 更多