使用任务检查互联网连接
本文关键字:互联网 连接 检查 任务 | 更新日期: 2023-09-27 18:18:24
我正在尝试执行一个后台任务,检查互联网连接而不阻塞GUI(检查功能需要3s来检查连接)。如果成功(或不成功),则面板显示图像(根据结果显示红色或绿色)。
我的代码:public Image iconeConnexion;
public Image IconeConnexion
{
get { return iconeConnexion; }
set { iconeConnexion = value; }
}
public void myPingCompletedCallback(object sender, PingCompletedEventArgs e)
{
if (e.Cancelled || e.Error != null)
{
this.iconeConnexion = WindowsFormsApplication1.Properties.Resources.red;
return;
}
if (e.Reply.Status == IPStatus.Success)
this.iconeConnexion = WindowsFormsApplication1.Properties.Resources.green;
}
public void checkInternet()
{
Ping myPing = new Ping();
myPing.PingCompleted += new PingCompletedEventHandler(myPingCompletedCallback);
try
{
myPing.SendAsync("google.com", 3000 /*3 secs timeout*/, new byte[32], new PingOptions(64, true));
}
catch
{
}
}
我在所有控件加载后的表单中的调用:
Task Parent = new Task(() =>
{
checkInternet();
MessageBox.Show("Check");
});
//Start the Task
Parent.Start();
Parent.Wait();
应用程序运行,但到目前为止没有显示任何图像。我不知道为什么。
你能帮我做这个吗?
由于您的问题中没有太多信息,我假设当尝试从后台线程设置UI元素时,会抛出异常并被Task
吞噬。
由于ping服务器是一个IO绑定操作,因此不需要启动一个新线程。这可以使事情与c# 5中引入的新async-await
关键字结合起来更容易。
这是使用Ping.SendPingAsync
:
public async Task CheckInternetAsync()
{
Ping myPing = new Ping();
try
{
var pingReply = await myPing.SendPingAsync("google.com", 3000, new byte[32], new PingOptions(64, true));
if (pingReply.Status == IPStatus.Success)
{
this.iconeConnexion = WindowsFormsApplication1.Properties.Resources.green;
}
}
catch (Exception e)
{
this.iconeConnexion = WindowsFormsApplication1.Properties.Resources.red;
}
}
并在FormLoaded事件中调用它:
public async void FormLoaded(object sender, EventArgs e)
{
await CheckInternetAsync();
}
作为旁注:
执行
Task
并立即等待它通常意味着你做错了什么。如果这是期望的行为,只需考虑同步运行方法。始终建议使用
Task.Run
而不是new Task
。前者返回"热任务"(已经启动的任务),而后者返回"冷任务"(尚未启动并等待Start
方法调用的任务)。