我创建了一个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的方式是正确的还是需要修改任何内容?
答案 0 :(得分:1)
我们是否需要为从长时间运行的方法(异步/同步)中调用的所有方法传递CancellationToken?
是的,如果您能够尊重的话。如果它不执行任何操作,则将其传递给方法毫无意义。
我处理CancellationToken的方式是正确的还是需要修改任何内容?
很难说,我们需要知道您的代码做什么。
如果服务即将关闭,它将使用CancellationToken取消所有待处理的工作。如果您有任何接受CancellationToken的异步调用,则应将其传递给该方法,以便在请求取消时退出。
如果您有诸如Method1()
之类的其他方法,并且它执行了一些长时间运行的工作,当您使用CancellationToken.IsCancellationRequested
或CancellationToken.ThrowIfCancellationRequested
请求取消时,仍然可以退出。如果要求取消,后者将抛出OperationCanceledException
。
例如,您可以执行以下操作:
public void Method1(CancellationToken cancellationToken)
{
// some work
if(cancellationToken.IsCancellationRequested)
return;
// some more work
if (cancellationToken.IsCancellationRequested)
return;
// some more work
}
由您决定该方法是否有一些逻辑点要检查是否取消,或者该方法是如此之快以至于不会有太大区别。
顺便说一下,这不是特定于服务结构的,您可以找到更多文档here。