2015-10-19 59 views
0

我有一個對象列表,每個對象都有一個Updated事件:public event System.Action Updated;現在我想獲得一個事件,當我的所有對象至少一次觸發了他們的Updated事件。當多個其他人都被呼叫時的單個事件呼叫?

什麼是最簡潔的方式來實現呢?

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

+3

你目前的方法有什麼問題?你有一些錯誤嗎?或者在所有對象更新之前觸發事件? –

+1

也許只是在每個事件結束時調用一個方法,這些事件使用由事件設置的布爾標誌作爲它們觸發的事件? 'if(!AllFlags){/ *什麼都不做* /} else {/ *現在做東西* /}' –

+1

我目前的做法?我沒有。每個對象都會更新它的更新事件,但是我需要知道什麼時候所有對象都已更新。 –

回答

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通過爲每個對象的你有:

​​

當所有的事件發生時,這個任務就會完成。如果您願意,甚至可以作爲延續發佈,或者只是公開該任務,以便消費者可以添加自己的延續來執行任何適當的操作。