我有同步方法,调用异步方法:
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
方法在不同的程序集中。业务层和UI层是分开的。我不想直接在SyncAllMappings
。
答案 0 :(得分: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);
}
答案 1 :(得分: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);
}