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;
});
}
答案 0 :(得分:1)
由于Remove
没有做任何真正的异步工作(例如IO),并且您担心的是您不想阻止UI线程,那么我建议您保持同步(不要使用)方法中的Task.Run
,async
和await
,并且仅使用线程池线程来阻止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;
}