C# Ping异步问题

C# Ping异步问题,c#,asynchronous,ping,C#,Asynchronous,Ping,我必须在下面指示的行上有一个断点,以下代码才能工作。否则,程序将无限期暂停 async Task<List<PingReply>> PingAsync() { var pingTargetHosts = GetIPs(); var pingTasks = pingTargetHosts.Select(host => new Ping().SendPingAsync(host, 2000)).ToList();

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

    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();
    }
async任务PingAsync()
{
var pingTargetHosts=GetIPs();
var pingTasks=pingTargetHosts.Select(主机=>new Ping().SendPingAsync(主机,2000)).ToList();
var pingResults=wait Task.WhenAll(pingTasks);//此行需要一个断点才能工作
返回pingResults.ToList();
}
代码是这样调用的

        List<PingReply> GetReplies()
    {
        var PingIPs = PingAsync();
        MessageBox.Show("Loading:...");
        List<PingReply> Results = PingIPs.Result;
        return Results;
    }
List getrepress()
{
var PingIPs=PingAsync();
MessageBox.Show(“加载:…”;
列表结果=PingIPs.Result;
返回结果;
}
谁能告诉我,我需要如何修改我的代码,以删除断点,但仍然有一段功能代码

编辑: 未经测试,但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
        }           
    }
async任务PingAsync()
{
var pingTargetHosts=GetIPs();
var pingTasks=pingTargetHosts.Select(异步主机=>wait new Ping().SendPingAsync(主机,2000)).ToList();
var pingResults=等待任务.WhenAll(pingTasks);
返回pingResults.ToList();
}
异步任务GetReplies()
{
var PingIPs=PingAsync();
MessageBox.Show(“加载:…”;
返回等待PingIPs;
}
异步任务BuildDictionary()
{
列表回复=等待GetReplies();
//通过foreach使用此列表
}
异步私有无效按钮1\u单击(对象发送方,事件参数e)
{
EthernetCheck checker=新的EthernetCheck();
checker.Check();
bool IsEthernetIn=checker.PluggedIn;
if(伊塞雷尼汀)
{
等待构建字典();
//做事
}           
}

当使用async/await时,您应该记住.net framework将控制程序执行流,因此,我建议您将所有调用设置为异步,以避免此类问题

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();
}
async任务PingAsync()
{
var pingTargetHosts=await GetIPs();
var pingTasks=pingTargetHosts.Select(主机=>wait new Ping().SendPingAsync(主机,2000)).ToList();
var pingResults=等待任务.WhenAll(pingTasks);
返回pingResults.ToList();
}

您的代码是死锁的,因为您是。要修复它,请使用:


睡眠可能有帮助你所说的“断点”是什么意思<代码>等待任务。当所有的不需要任何断点来工作时,代码本身会导致阻塞。您正在调用
wait
,同时已使用
.Result
阻止UI线程。您的
GetReplies
方法本身应该是异步的,即
async Task GetReplies(){MessageBox.Show();return wait PingAsync();}
谁调用
GetReplies
?如果调用以事件处理程序开始,则应该使事件处理程序的所有方法都是异步的。事件处理程序本身应该是
async void
与任何异步方法
var repries=wait getrepries()相同的方式当它只是用来生成列表时,为什么要在GetIPs上使用wait?它返回
列表
。另外,我在
var-pingTasks=
行中添加wait需要在主机之前使用async。我现在不能测试,因为我在家,我会让你知道这是否有效。谢谢。请告诉我们它是否有效,或者您是否找到其他解决方案。谢谢你。
async void BuildDictionary(){var repress=wait getrepress()
是我应该做的,我想。不幸的是,我在一个多星期内都无法测试这个。@LukeIreland:不;你应该避免
异步无效
。改用
异步任务
。它们产生相同的结果/效果吗?你能解释区别吗?我读了你的两篇文章,但仍然不是100%。我已经更新了我的主要帖子中的“prototype”包含异步任务@StephenCleary@LukeIreland:您的新代码看起来不错。我解释了其中的区别-特别是,
async void
具有难以处理的异常处理行为,则会出现一个按钮单击事件,该事件会弄乱我的所有代码。如何将这些代码部分分开。
async Task<List<PingReply>> GetRepliesAsync()
{
  var PingIPs = PingAsync();
  MessageBox.Show("Loading:...");
  return await PingIPs;
}
var replies = await GetRepliesAsync();