2015-10-25 3 views
1

У меня есть веб-страница, которая имеет форму для добавления устройств.C# - Как обновить веб-страницу после вызова метода асинхронного вызова?

Когда пользователь добавляет устройство, устройство зарегистрировано в 4 разных местах. Поскольку каждая из этих 4 регистраций требует времени, я решил использовать асинхронные вызовы.

Итак, когда пользователь нажимает кнопку сохранения, на сервер запускается запрос AJAx и вызывается метод «Сохранить». Метод «Сохранить» имеет цикл с асинхронным вызовом метода «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(); 
} 

Проблема здесь состоит в том, что «GetRegisteredDevices» вызов не имеет смысла, потому что методы не имеют асинхронные законченный но не будет никаких устройств для возврата. Кроме того, я не могу обновить пользовательский интерфейс, когда эти действия закончатся, потому что основной метод уже возвращен в пользовательский интерфейс.

(я игнорирую дело здесь, если пользователь перемещает другую страницу сразу после нажатия на кнопку «Сохранить».)

Итак, есть ли способ для меня, чтобы знать, когда все асинхронные звонков закончены и затем вызывать метод, который будет обновлять пользовательский интерфейс?

+1

Можете ли вы перейти на TPL вместо старого стиля begin/endinvoke? – caesay

+0

[this] (http://stackoverflow.com/questions/26069487/async-and-await-with-for-loop) может помочь – LiranBo

+0

Я мог бы перейти на TPL, если бы знал, что это такое ... Что такое TPL ??? –

ответ

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 
} 
+0

Любая идея, почему этот код не компилируется? '' System.Threading.Tasks.Task 'не содержит определения для' WhenAll'' –

+0

это может быть связано с каркасом 4 ant not 4.5 или 5? –

+0

@Liran Да, 'Task.WhenAll' недоступен в .NET 4. Попробуйте [' Microsoft.Bcl.Async'] (https://www.nuget.org/packages/Microsoft.Bcl.Async/) пакет от NuGet. –

Смежные вопросы