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,所以当连接被检查应用程序正在等待,但不挂起
如果你不能使用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();
}