[英]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.Run
, async
和await
在方法內),並且只使用線程池線程來阻止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.