当多个其他事件都被调用时,单个事件调用
本文关键字:事件 调用 单个 其他 | 更新日期: 2023-09-27 18:18:24
我有一个对象列表,每个对象都有一个Updated
事件:public event System.Action Updated;
现在我想得到一个事件,当我的所有对象都至少触发一次他们的Updated
事件时。
实现这一点的最干净方法是什么?
注意:我正在使用 Unity,它不必是线程安全的。
首先编写一个方法来创建一个将在下次触发事件时完成的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()));
然后,当所有事件都触发后,该任务将完成。 如果需要,可以触发偶数作为延续,或者只是公开该任务,以便使用者可以添加自己的延续来执行任何适当的操作。