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

时间:2015-10-25 06:24:28

标签: c# asynchronous web .net-4.0 entity-framework-4

我有一个网页,其中包含添加设备的表单。

当用户添加设备时,该设备在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的方法?

1 个答案:

答案 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
}