Blazor Server应用中如何同时Ping多个IP地址避免阻塞?
Blazor Server 多IP并行Ping实现方案
你的代码目前是串行执行两次Ping操作,因为await PingMachine(...)会等待当前任务完成后才启动下一个。要实现并行执行、互不阻塞,核心是同时启动多个异步任务,再统一等待所有任务完成,具体修改如下:
1. 修正PingMachine的参数错误
原方法参数顺序不符合C#语法(可选参数需放在最后),且IP地址参数类型有误,先修正:
private async ValueTask PingMachine(string ipAddress, int timesToPing = 4) { log.AppendLine($"Pinging {ipAddress}"); StateHasChanged(); await Task.Delay(1); var counter = 1; while (counter <= timesToPing) { var reply = await Pinger(ipAddress); log.AppendLine($"Pinged {ipAddress} : {counter} times => address: {reply.Address} - time:{reply.RoundtripTime} - status: {reply.Status.ToString()}"); counter++; StateHasChanged(); } }
2. 修改PingAddress实现并行执行
使用Task.WhenAll同时启动多个Ping任务,等待所有任务完成:
private async Task PingAddress() { if (this.ipAddress != string.Empty) { // 同时启动两个Ping任务,此时两个任务已开始执行 var pingTask1 = PingMachine("10.92.116.73"); var pingTask2 = PingMachine("10.92.116.74"); // 等待两个任务全部完成,不阻塞彼此执行 await Task.WhenAll(pingTask1, pingTask2); } }
扩展:批量Ping多个IP
如果需要Ping更多地址,可以将IP存入集合,批量创建任务:
private async Task PingMultipleAddresses() { var targetIps = new List<string> { "10.92.116.73", "10.92.116.74", "10.92.116.75" }; // 批量生成Ping任务 var pingTasks = targetIps.Select(ip => PingMachine(ip)).ToList(); // 等待所有任务完成 await Task.WhenAll(pingTasks); }
注意事项
Blazor Server中,await后的代码默认会回到组件的同步上下文,因此StateHasChanged可以正常触发UI更新,无需额外处理线程安全问题。
内容的提问来源于stack exchange,提问作者Mdarende
相关产品推荐
相关产品推荐

