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?
使用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
}