【问题标题】:Cancellation Token usage in Service fabricService Fabric 中的取消令牌使用情况
【发布时间】:2020-02-18 17:01:13
【问题描述】:

我创建了一个 Service Fabric 应用程序。 RunAsync() 方法中有一个长期运行的作业,例如“LoadData(),它将数百万条记录从数据库迁移到 ServiceFabric 字典”。

根据 MSDN 文档,想要实现在服务启动时运行的后台任务的服务应使用其逻辑“RunAsync(CancellationToken)”覆盖此方法

取消令牌用于监视取消请求,它存在于 RunAsync() 并关闭服务。所以我在我的项目中使用了 CancellationToken。

这是我的代码

RunAsync (System.Threading.CancellationToken cancellationToken);
{
 LoadData(CancellationToken);
}
Async Task LoadData(CancellationToken)
{
 Method1(CancellationToken) -- Aync call
 Method2() -- Normal call
 Method3() -- Normal call
}

如您所见,我有 Method1,它是一个异步调用,它作为单独的线程运行,因此相同的令牌被传递给此方法,因为主线程不会知道子线程。 但是 Method2 和 Method3 只是函数调用所以 CancellationToken 没有被传递,因为它们是在主线程的上下文中运行的。

我有几个关于 Service Fabric 中 CancellationToken 用法的问题。 1. 我们是否需要为从长时间运行的方法(异步/同步)调用的所有方法传递 CancellationToken? 2. 我处理CancellationToken的方式是正确的还是需要修改什么?

【问题讨论】:

    标签: azure asp.net-core azure-service-fabric


    【解决方案1】:

    我们是否需要为从长时间运行的方法(异步/同步)调用的所有方法传递 CancellationToken?

    是的,如果你能够尊重它。如果它不做任何事情,将它传递给一个方法是没有意义的。

    我处理 CancellationToken 的方式是正确的还是需要修改什么?

    很难说,我们需要知道你的代码是做什么的。

    如果服务要关闭,它将使用 CancellationToken 取消任何待处理的工作。如果您有任何接受 CancellationToken 的异步调用,则应将其传递给该方法,以便在请求取消时退出。

    如果您有一些其他方法,例如Method1(),并且它执行了一些长时间运行的工作,您仍然可以在使用CancellationToken.IsCancellationRequestedCancellationToken.ThrowIfCancellationRequested 请求取消时退出。如果请求取消,后者将抛出 OperationCanceledException

    例如,您可以这样做:

    public void Method1(CancellationToken cancellationToken)
    {
        // some work
    
        if(cancellationToken.IsCancellationRequested)
            return;
    
        // some more work
    
        if (cancellationToken.IsCancellationRequested)
            return;
    
        // some more work
    }
    

    由您决定该方法是否有一些逻辑点来检查取消,或者该方法是否如此之快以至于不会产生太大影响。

    顺便说一下,这不是特定于服务结构的,您可以找到更多文档here

    【讨论】:

      猜你喜欢
      • 2015-07-11
      • 2018-09-01
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 2013-05-04
      相关资源
      最近更新 更多