簡體   English   中英

如何將這個lambda表達式轉換為async / await?

[英]How to convert this lambda expression to async/await?

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

由於Remove不做任何真正的異步工作(例如IO),並且您擔心的是您不想阻止UI線程,那么我建議您保持同步(不要使用Task.Runasyncawait在方法內),並且只使用線程池線程來阻止UI事件處理程序中的UI線程。 這是一個例子:

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

一種方法是使用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;
    }

這應該工作。

   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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM