使用任务检查Internet连接

时间:2014-08-18 12:55:22

标签: c# multithreading winforms task

我正在尝试执行后台任务,检查互联网连接而不阻止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();

应用程序运行但到目前为止没有显示图像。无法找出原因。

你能帮帮我吗?

1 个答案:

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

作为旁注:

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

  2. 始终建议使用Task.Run代替new Task。前者返回“热门任务”(一个已经启动),而后者返回“冷任务”(一个尚未启动并等待要调用的Start方法。