【发布时间】:2017-02-16 11:48:52
【问题描述】:
我必须在下面指示的行上有一个断点才能使以下代码正常工作。否则,程序将无限期暂停。
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
}
}
【问题讨论】:
-
Thread.Sleep 可以提供帮助
-
“断点”是什么意思?
await Task.WhenAll不需要任何断点即可工作 -
您的代码本身导致了阻塞。您正在调用
await,而您已经 用.Result阻塞了UI 线程。您的GetReplies方法本身应该是异步的,即async Task<List<PingReply>> GetReplies(){MessageBox.Show();return await PingAsync();} -
谁打电话给
GetReplies?如果调用以事件处理程序开始,则应使事件处理程序之前的所有方法都是异步的。事件处理程序本身应该是async void -
和任何异步方法一样
var Replies=await GetReplies();
标签: c# asynchronous ping