使用任务检查互联网连接

本文关键字:互联网 连接 检查 任务 | 更新日期: 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();
}

作为旁注:

  1. 执行Task并立即等待它通常意味着你做错了什么。如果这是期望的行为,只需考虑同步运行方法。

  2. 始终建议使用Task.Run而不是new Task。前者返回"热任务"(已经启动的任务),而后者返回"冷任务"(尚未启动并等待Start方法调用的任务)。