Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#如何在可实现且不阻塞的UI中检查internet连接?_C#_.net_Connection - Fatal编程技术网

C#如何在可实现且不阻塞的UI中检查internet连接?

C#如何在可实现且不阻塞的UI中检查internet连接?,c#,.net,connection,C#,.net,Connection,虽然之前我正在寻找一些可行的方法来检查互联网连接,但同时我希望它不会让我的应用程序变得不负责任,我发现了各种类似于以下代码的示例: public static bool CheckForInternetConnection() { try { using (var client = new WebClient()) using (var stream = client.OpenRead("http:/

虽然之前我正在寻找一些可行的方法来检查互联网连接,但同时我希望它不会让我的应用程序变得不负责任,我发现了各种类似于以下代码的示例:

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不负责任

干杯 MTH

编辑:

我希望此代码可以从多个代码路径中获得,最好是作为某个静态类的静态方法。以后台工作者的身份做这件事确实在某种程度上限制了它。我将尝试使用单独的线程,看看它是否会带来我想要达到的效果


我只想得到在调用上述简单方法期间发生的所有事情(延迟,所有其他操作等待方法完成),而不阻塞UI,因此,在检查连接时,应用程序正在等待但不挂起,您需要使用多线程在另一个线程上运行检查,以便它不会干扰主应用程序

Thread thread = new Thread(() => ConnectionCheck());
thread.Start();
...
public static void ConnectionCheck()
{
     bool result = CheckForInternetConnection();
     //Do something with result
}
在您的情况下,使用a可能更容易,使用返回值也更容易。您可以运行任务,将输出存储在
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();
}

如果您不能使用BackgroundWorker,并且您的目标是.NET4.5,那么您可以将该方法包装在一个文件中


在不同的线程上检查它?看来这正是我想要的,谢谢!
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( );
        }