服务结构中取消令牌的使用

时间:2019-10-22 14:01:33

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

我创建了一个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的方式是正确的还是需要修改任何内容?

1 个答案:

答案 0 :(得分: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