我有一个网页,其中包含添加设备的表单。
当用户添加设备时,该设备在4个不同的位置注册。 由于这4个注册中的每一个都需要时间,所以我决定使用异步调用。
因此,当用户单击保存按钮时,会向服务器触发AJAx请求并调用" Save"方法。 " Save"方法有一个循环,异步调用"寄存器"方法,像这样:
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();
}
这里的问题是&#34; GetRegisteredDevices&#34;电话是没有意义的,因为异步方法还没有完成,也没有设备可以返回。 此外,当这些操作完成后我无法更新UI,因为main方法已经返回到UI。
(如果用户在点击&#34; Save&#34;按钮后立即移动另一页,我就忽略了这种情况。)
那么,有没有办法让我知道所有异步调用何时完成,然后调用一个更新UI的方法?
答案 0 :(得分:0)
使用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
}