Ping ASync问题

时间:2017-02-16 11:48:53

标签: c# asynchronous ping

我必须在下面的指示行上有一个断点才能使以下代码生效。否则,程序会无限期地暂停。

    async Task<List<PingReply>> PingAsync()
    {
        var pingTargetHosts = GetIPs();
        var pingTasks = pingTargetHosts.Select(host => new Ping().SendPingAsync(host, 2000)).ToList();
        var pingResults = await Task.WhenAll(pingTasks); //THIS LINE NEEDS A BREAKPOINT TO WORK
        return pingResults.ToList();
    }

代码就像这样调用

        List<PingReply> GetReplies()
    {
        var PingIPs = PingAsync();
        MessageBox.Show("Loading:...");
        List<PingReply> Results = PingIPs.Result;
        return Results;
    }

有人可以告诉我如何修改我的代码以删除断点但仍然有一段功能代码。

编辑: 没有经过测试,但99%肯定会有效。

async Task<List<PingReply>> PingAsync()
    {
        var pingTargetHosts = GetIPs();
        var pingTasks = pingTargetHosts.Select(async host => await new Ping().SendPingAsync(host, 2000)).ToList();
        var pingResults = await Task.WhenAll(pingTasks);
        return pingResults.ToList();
    }

    async Task<List<PingReply>> GetReplies()
    {
        var PingIPs = PingAsync();
        MessageBox.Show("Loading:...");
        return await PingIPs;
    }

    async Task BuildDictionary()
    {
        List<PingReply> Replies = await GetReplies();
        //Use this list via foreach
    }
    async private void button1_Click(object sender, EventArgs e)
    {
        EthernetCheck checker = new EthernetCheck();
        checker.Check();
        bool IsEthernetIn = checker.PluggedIn;
        if (IsEthernetIn)
        {
            await BuildDictionary();
            //Do Stuff
        }           
    }

2 个答案:

答案 0 :(得分:0)

当使用async / await时你应该记住.net框架将控制程序执行的流程,所以我建议你让所有的调用异步以避免这种问题。

async Task<List<PingReply>> PingAsync()
{
    var pingTargetHosts = await GetIPs();
    var pingTasks = pingTargetHosts.Select(host => await new Ping().SendPingAsync(host, 2000)).ToList();
    var pingResults = await Task.WhenAll(pingTasks);
    return pingResults.ToList();
}

答案 1 :(得分:0)

你的代码是死锁的,因为你是blocking on asynchronous code。要解决此问题,请使用async all the way

async Task<List<PingReply>> GetRepliesAsync()
{
  var PingIPs = PingAsync();
  MessageBox.Show("Loading:...");
  return await PingIPs;
}

用法:

var replies = await GetRepliesAsync();