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