当多个其他事件都被调用时,单个事件调用

本文关键字:事件 调用 单个 其他 | 更新日期: 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()));

然后,当所有事件都触发后,该任务将完成。 如果需要,可以触发偶数作为延续,或者只是公开该任务,以便使用者可以添加自己的延续来执行任何适当的操作。