Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure 服务结构中的取消令牌使用_Azure_Asp.net Core_Azure Service Fabric - Fatal编程技术网

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

Azure 服务结构中的取消令牌使用,azure,asp.net-core,azure-service-fabric,Azure,Asp.net Core,Azure Service Fabric,我已经创建了一个服务结构应用程序。RunAsync()方法中有一个长期运行的作业,如“LoadData(),它将数百万条记录从数据库迁移到ServiceFabric dictionary” 根据MSDN文档,要实现后台任务(在服务启动时运行)的服务应使用其逻辑“RunAsync(CancellationToken)”覆盖此方法 取消令牌用于监视取消请求,它存在于RunAsync()中并关闭服务。所以我在我的项目中使用了CancellationToken 这是我的密码 如您所见,我有Method1

我已经创建了一个服务结构应用程序。RunAsync()方法中有一个长期运行的作业,如“LoadData(),它将数百万条记录从数据库迁移到ServiceFabric dictionary”

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

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

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

我有几个关于服务结构中CancellationToken使用的问题。 1.我们是否需要为从长时间运行的方法(异步/同步)调用的所有方法传递CancellationToken? 2.我处理CancellationToken的方式是正确的,还是需要修改任何内容

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

是的,如果你能尊重它。如果方法不处理它,那么将它传递给方法是没有意义的

我处理CancellationToken的方式是正确的,还是需要修改任何内容

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

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

如果您有一些其他方法,如
Method1()
,并且它执行了一些长时间运行的工作,那么当使用
CancellationToken.IsCancellationRequested
CancellationToken.throwifccancellationrequested
请求取消时,您仍然可以退出。如果请求取消,后者将抛出
操作CanceledException

例如,您可以执行以下操作:

public void Method1(CancellationToken cancellationToken)
{
    // some work

    if(cancellationToken.IsCancellationRequested)
        return;

    // some more work

    if (cancellationToken.IsCancellationRequested)
        return;

    // some more work
}
这取决于您决定该方法是否有一些逻辑点需要检查是否取消,或者该方法是否太快,不会产生太大影响

顺便说一下,这不是特定于service fabric的,您可以找到更多文档

public void Method1(CancellationToken cancellationToken)
{
    // some work

    if(cancellationToken.IsCancellationRequested)
        return;

    // some more work

    if (cancellationToken.IsCancellationRequested)
        return;

    // some more work
}