如何将此lambda表达式转换为async/await
本文关键字:async await 转换 表达式 lambda | 更新日期: 2023-09-27 17:49:25
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
。
乌利希期刊指南:
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;
}