我注意到了.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