【发布时间】:2021-01-22 11:17:55
【问题描述】:
最近我遇到了 a Microsoft interface 一个非常不寻常的 API:
public interface IHostApplicationLifetime
{
public CancellationToken ApplicationStarted { get; }
public CancellationToken ApplicationStopping { get; }
public CancellationToken ApplicationStopped { get; }
}
ApplicationStopping 属性的文档令人困惑地暗示此属性实际上是一个事件(已添加重点):
在应用程序主机执行正常关闭时触发。在此事件完成之前,关闭将被阻止。
似乎应该是传统的EventHandler 事件,已被CancellationToken 属性所取代。这就是我所期望的
界面为:
public interface IHostApplicationLifetime
{
public event EventHandler ApplicationStarted;
public event EventHandler ApplicationStopping;
public event EventHandler ApplicationStopped;
}
我的问题是,这两种通知机制是否等效?如果不是,从 API 设计者的角度来看,每种方法的优缺点是什么?在哪些情况下CancellationToken 属性优于经典事件?
【问题讨论】:
-
use an event vs a cancellation token完全不同的概念和含义。您能否用您尝试过的内容、无效的内容和预期的输出来更新您的帖子? -
一个事件,我假设你的意思是
System.Threading.AutoResetEvent或类似的,与取消令牌非常不同。 -
可以将
CancelationToken烘焙到方法中并使其可取消。你会如何对一个事件做同样的事情?您能否通过使用事件而不是CancelationToken的BlockingCollection<T>.Take方法的替代示例来更新您的问题? -
CancellationToken超过EventHandler的原因很简单。使用 EventHandler,您将不知道ApplicationStarted是否在您的EventHandler注册运行之前运行。这意味着您需要添加bool IsApplicationStarted { get; }属性。CancellationToken也会隐式处理事件的生命周期。 -
这里有一篇博文解释了这个架构决策:andrewlock.net/… 这样是否更清楚?
标签: c# events .net-core cancellation-token