2016-03-16 3 views
1

у меня есть синхронный метод, который вызывает метод асинхронной:Awaitable метод - назовем событие, когда закончил

private void Sync_Click(object sender, EventArgs e) 
{ 
    CancellationToken token = new CancellationToken(); 
    SyncAllMappings(token);    
} 

async void SyncAllMappings(CancellationToken token) 
{ 
    //create collection of tasks per each mapping 
    IEnumerable<Task<Task>> tasks = SomeLogicHere(); 
    await Task.WhenAll(tasks); 
} 

управление возвращается пользователю, прежде чем все задачи выполняются. Можно ли получить уведомление, когда все задачи завершены? Я хотел бы иметь возможность вызвать какой-то другой метод, который отображает текст и включает несколько кнопок, когда все задачи завершаются (и все сопоставления находятся в синхронизации).

SyncAllMappings способ есть другой сборка. Уровни бизнеса и пользовательского интерфейса разделены. Я не хочу вызывать методы пользовательского интерфейса напрямую в SyncAllMappings.

ответ

3

Вы должны сделать свой обработчик события асинхр и ждать его, и когда задачи отделки сделать некоторые UI работы:

private async void Sync_Click(object sender, EventArgs e) 
{ 
     CancellationToken token = new CancellationToken(); 
     await SyncAllMappings(token);    
     // do buttons enable disabling here 
} 

и ваш второй метод должен возвращаться Task вместо void:

async Task SyncAllMappings(CancellationToken token) 
{ 
     //create collection of tasks per each mapping 
     IEnumerable<Task<Task>> tasks = SomeLogicHere(); 

     await Task.WhenAll(tasks); 
} 
3

Элемент управления возвращается пользователю перед выполнением всех задач.

Да, так работает асинхронный процесс. Вместо того, чтобы в async void метод, вы должны сделать его async Task - и затем сделать свой метод Sync_Click асинхронном, так что вы можете ждать результата:

private async void Sync_Click(object sender, EventArgs e) 
{ 
    CancellationToken token = new CancellationToken(); 
    await SyncAllMappings(token);    
    // Do whatever you want here, e.g. raising an event 
} 

async Task SyncAllMappings(CancellationToken token) 
{ 
    //create collection of tasks per each mapping 
    IEnumerable<Task<Task>> tasks = SomeLogicHere(); 

    await Task.WhenAll(tasks); 
}