如何将这个lambda表达式转换为async / await?

时间:2016-06-25 12:03:03

标签: c# asynchronous lambda

public bool Remove()
{
    var itemsToRemove = activeQueue.Where(x => x.Value.CanRemove()).ToArray();
    foreach(var item in itemsToRemove)
        activeQueue.Remove(item.Key);

    return passiveQueue.IsEmpty && activeQueue.Count == 0;
}

我想让Remove方法等待 - public async bool Remove()。因此,唯一阻止的是CanRemove,现在正在返回Task<bool>。但我不确定如何制作await

UPD:

public Task<bool> CanRemove()
{
    return Task.Run(() => {
         ...
         return false;
    });
}

3 个答案:

答案 0 :(得分:1)

由于Remove没有做任何真正的异步工作(例如IO),并且您担心的是您不想阻止UI线程,那么我建议您保持同步(不要使用)方法中的Task.Runasyncawait,并且仅使用线程池线程来阻止UI事件处理程序中的UI线程。这是一个例子:

private async void button_Clicked(object sender, EventArgs e)
{
    var result = await Task.Run(() => Remove());
    //...
}

答案 1 :(得分:0)

一种方法是使用Task.Run()

public async Task<bool> Remove()
    {
        await Task.Run(() => {
             var itemsToRemove = activeQueue.Where(x => x.Value.CanRemove()).ToArray();
             foreach(var item in itemsToRemove)
                 activeQueue.Remove(item.Key);
         });

        return passiveQueue.IsEmpty && activeQueue.Count == 0;
    }

答案 2 :(得分:0)

这应该有用。

   public async Task<bool> Remove()
    {
        for (int i = activeQueue.Count; i>=0; i++)
        {
            var aq = activeQueue[i];
            var canRemove = await aq.Value.CanRemove();
            if (canRemove)
            {
                activeQueue.RemoveAt(i);
            }                    
        }           

        return passiveQueue.IsEmpty && activeQueue.Count == 0;
    }