等待方法 - 完成后调用事件

时间:2016-03-16 12:42:04

标签: c# async-await

我有同步方法,调用异步方法:

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

中调用UI方法

2 个答案:

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