我有一个对象列表,每个对象都有一个Updated
事件:public event System.Action Updated;
现在我想获得一个事件,当我的所有对象至少触发了Updated
事件时一次。
实施此最简洁的方法是什么?
注意:我在Unity工作,并且它不必是线程安全的。
答案 0 :(得分:0)
首先编写一个创建Task
的方法,该方法将在下次事件触发时完成:
public static Task WhenUpdated(this IUpdatable updatable)
{
var tcs = new TaskCompletionSource<bool>();
Action handler = null;
handler = () =>
{
tcs.TrySetResult(true);
updatable.Updated -= handler;
};
updatable.Updated += handler;
return tcs.Task;
}
完成后,您可以使用WhenAll
,为您拥有的每个对象传递Task
:
var task = Task.WhenAll(list.Select(item => item.WhenUpdated()));
当所有事件都被触发时,该任务将完成。如果需要,您可以触发偶数作为延续,或者只是暴露该任务,以便消费者可以添加自己的延续来执行任何适当的操作。