c# -如何在调用异步方法后更新网页

本文关键字:异步方法 更新 网页 调用 | 更新日期: 2023-09-27 18:19:11

我有一个网页,有一个表单添加设备。

当用户添加设备时,该设备在4个不同的地方注册。因为这4个注册都需要时间,所以我决定使用异步调用。

因此,当用户单击save按钮时,将向服务器发送一个AJAx请求并调用"save"方法。"Save"方法有一个异步调用"Register"方法的循环,像这样:

public delegate bool DeviceControllerAsync(...);
public static string Save(...)
{
    //Get all active controllers
    List<Controller> lstControllers = Controller.Get();
    foreach (Controller controller in lstControllers)
    {
        // Invoke asynchronous write method
        DeviceControllerAsync caller = new DeviceControllerAsync(ArubaBL.RegisterDevice);
        // Initiate the asychronous call.
        IAsyncResult result = caller.BeginInvoke(..., null, null);
    }
    return GetRegisteredDevices();
}

这里的问题是,"geregistereddevices"调用是毫无意义的,因为异步方法还没有完成,将没有设备返回。此外,当这些操作完成时,我无法更新UI,因为主方法已经返回到UI。

(这里我忽略了用户在点击"保存"按钮后向右移动另一页的情况)

所以,有没有一种方法让我知道当所有异步调用完成,然后调用一个方法,将更新UI?

c# -如何在调用异步方法后更新网页

使用TPL库和async/await关键字的简化示例。

public static async string Save(...)
{
    //Get all active controllers
    List<Controller> lstControllers = Controller.Get();
    //Create a task object for each async task
    List<Task<returnValueType>> controllerTasks = lstControllers.Select(controller=>{
        DeviceControllerAsync caller = new DeviceControllerAsync(ArubaBL.RegisterDevice);
        return Task.Factory.FromAsync<returnValueType>(caller.BeginInvoke, caller.EndInvoke, null);
    }).ToList();
    // wait for tasks to complete (asynchronously using await)
    await Task.WhenAll(controllerTasks);
    //Do something with the result value from the tasks within controllerTasks
}