在C#
中,尽管the new cancellation framework最初的想法是将CancellationToken.Register
用于通知以取消操作,但它可以用作简单事件通知的机制。也是
让我们以IApplicationLifetime
及其在ASP.NET/Hosting中的实现为例。
ApplicationLifetime
的简化版本如下:
/// <summary>
/// Allows consumers to perform cleanup during a graceful shutdown.
/// </summary>
public class ApplicationLifetime : IApplicationLifetime
{
private readonly CancellationTokenSource _startedSource = new CancellationTokenSource();
/// <summary>
/// Triggered when the application host has fully started and is about to wait
/// for a graceful shutdown.
/// </summary>
public CancellationToken ApplicationStarted => _startedSource.Token;
/// <summary>
/// Signals the ApplicationStarted event and blocks until it completes.
/// </summary>
public void NotifyStarted()
{
_startedSource.Cancel(throwOnFirstException: false);
}
}
客户端可以注册应用程序启动通知并执行某些操作,而不必取消操作。
lifetime.ApplicationStarted.Register(() =>
{
Console.WriteLine("Started");
});
然后发出请求的对象可以发出通知:
_applicationLifetime?.NotifyStarted();
基本上,使用standard或updated .NET事件模式,您可以实现几乎相同的效果。或者,我会错过什么吗?
从架构的角度来看,这两种方法之间有什么区别?利弊?什么时候使用一个或另一个?
CancellationToken.Register
是用于简单事件通知的机制,只是模式的“创造性”使用吗?
答案 0 :(得分:0)
取消令牌的目的是帮助解决多线程代码中的故障状态。有与任务相关的内置方法使用取消机制,因此,如果您使用相同的方法,则可以使代码与它们无缝地协同工作。采用标准方法可以简化编写库代码的过程,因为它可以假定调用者正在使用相同的方法。
标准.NET事件机制不了解线程,因此,如果这是一个潜在问题,则需要处理可能的多线程问题。在简单情况下,.NET偶数机制也可以正常工作。如果您自己的情况更为复杂,则应考虑使用取消令牌方法。