我正在尝试执行后台任务,检查互联网连接而不阻止GUI(检查功能需要3秒来检查连接)。如果成功(或不成功),面板将显示图像(根据结果显示红色或绿色)。
我的代码:
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();
应用程序运行但到目前为止没有显示图像。无法找出原因。
你能帮帮我吗?
答案 0 :(得分:0)
由于您的问题中没有太多信息,我认为当尝试从后台线程设置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
方法。