CancellationToken。注册为事件通知与标准.NET事件模式的机制

时间:2018-10-11 23:18:22

标签: c# events

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();

基本上,使用standardupdated .NET事件模式,您可以实现几乎相同的效果。或者,我会错过什么吗?

从架构的角度来看,这两种方法之间有什么区别?利弊?什么时候使用一个或另一个?

CancellationToken.Register是用于简单事件通知的机制,只是模式的“创造性”使用吗?

1 个答案:

答案 0 :(得分:0)

取消令牌的目的是帮助解决多线程代码中的故障状态。有与任务相关的内置方法使用取消机制,因此,如果您使用相同的方法,则可以使代码与它们无缝地协同工作。采用标准方法可以简化编写库代码的过程,因为它可以假定调用者正在使用相同的方法。

标准.NET事件机制不了解线程,因此,如果这是一个潜在问题,则需要处理可能的多线程问题。在简单情况下,.NET偶数机制也可以正常工作。如果您自己的情况更为复杂,则应考虑使用取消令牌方法。