我注意到了.NET 4.0中的一種新趨勢,特別是在潛在的多線程場景中,它避免了事件,並提供了訂閱者方法。訂閱者方法vs事件
例如,System.Threading.Tasks.Task和Task<TResult>
有ContinueWith()方法而不是Completed或Finished事件。另一個示例是System.Threading.CancellationToken:它有一個Register()方法而不是CancellationRequested事件。
雖然Task.ContinueWith()是合乎邏輯的,因爲它可以很容易的任務鏈(不會與事件如此優雅),而且它也允許Task<TResult>
從Task
繼承(因爲這樣一來,Task<TResult>
可以提供適當的過載,這對一個事件來說是不可能的:如果你有一個事件EventHandler在Task中完成,你所能做的就是創建另一個事件,比如事件EventHandler<TaskResultEventArgs>
在Task<TResult>
中完成,這不是很好),但是我找不到對CancellationToken.Register()的解釋相同。
那麼,類似情況下事件的缺點是什麼?我是否也應該遵循這種模式?爲了澄清,我應該選擇哪一種?我應該什麼時候比較喜歡一個?
public event EventHandler Finished;
// or
public IDisposable OnFinished(Action continuation)
非常感謝!
@Jon Skeet:謝謝,我沒有注意到我的天使托架需要一些逃脫。 – ShdNx 2011-06-15 10:35:35
UI事件等可以使用UI消息隊列發佈,並且與使用委託或簡單任務相比,可能會非常緩慢/沉重。 – CodingBarfield 2011-06-15 10:54:38
@Barfieldmv:可以使用與Invoke/BeginInvoke相同的技術將動作調用發佈到UI線程。這不是區別。 – 2011-06-15 10:59:54