所有多个人都被调用时,单个事件呼叫?

时间:2015-10-19 13:57:57

标签: c# events unity3d

我有一个对象列表,每个对象都有一个Updated事件:public event System.Action Updated;现在我想获得一个事件,当我的所有对象至少触发了Updated事件时一次。

实施此最简洁的方法是什么?

注意:我在Unity工作,并且它不必是线程安全的。

1 个答案:

答案 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()));

当所有事件都被触发时,该任务将完成。如果需要,您可以触发偶数作为延续,或者只是暴露该任务,以便消费者可以添加自己的延续来执行任何适当的操作。