You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:45:47