C# 取消令牌源示例

C# 取消令牌源示例,c#,asynchronous,C#,Asynchronous,我正在执行一些异步操作,我想使用CancellationToken来停止异步任务的运行,例如,如果用户请求这样做。为了做到这一点,使用字典查找正确的线程以停止正确的操作是否是一种好的做法?我现在看到的是: public Dictionary<Thread, CancellationToken> CancellationTokenData; 公共字典取消标记数据; 因此,如果用户请求取消某个操作,如果我没有错,它的行为应该正确吗 实现这一点的最佳实践是什么 例如,假设用户使

我正在执行一些异步操作,我想使用CancellationToken来停止异步任务的运行,例如,如果用户请求这样做。为了做到这一点,使用字典查找正确的线程以停止正确的操作是否是一种好的做法?我现在看到的是:

    public Dictionary<Thread, CancellationToken> CancellationTokenData;
公共字典取消标记数据;
因此,如果用户请求取消某个操作,如果我没有错,它的行为应该正确吗

实现这一点的最佳实践是什么


例如,假设用户使用线程{B}对数据库中的集合{a}执行一些非常长的操作。然后,他取消该操作,并使用另一个线程对集合{A}执行另一个冗长的操作。我是否应该为当前的
CancellationToken
使用全局变量?

通常,每个操作都有一个可取消的
CancellationTokenSource
。您将CancellationTokenSource传递给可能需要取消操作的所有人(
cts.cancel()
),并将其
CancellationToken
cts.Token
)传递给需要知道取消的所有人

在这个抽象级别,您不会停止线程;你停止行动。线程仅仅是实现细节


因此,我认为将令牌映射到线程不是一个好主意。如果涉及到任务,这是一个非常糟糕的主意,因为不能保证每个任务都在一个新线程上运行。

我不能说我理解您的要求,但取消非常简单,绝对没有理由跟踪线程。您创建一个CancellationTokenSource并将其令牌传递给任何长操作,即任何接受取消令牌的方法。客户端调用
以中止,源向令牌发出信号,任何监视此操作的操作都会正常终止。终止的是操作/方法,而不是线程。没有“当前”令牌,您可以将同一令牌传递给多个operations@PanagiotisKanavos好的,但是你用局部变量来做这个吗?如果我用的是局部变量,我会受到太多的限制,只能在当前方法中调用它,如果我用它作为全局变量,事情会变得一团糟?我应该为每一个设置一个全局设置吗?我希望我们在同一条轨道上。我是否正确理解线程之间存在依赖关系?当然,您必须为它们使用相同的令牌-使用字典没有任何意义…这是否意味着一个取消令牌可以在同一时间映射到多个操作@PanagiotisKanavos不,线程之间没有依赖关系,那么您通常如何将cancellationtoken映射到操作?例如,假设我想停止一个操作A的执行,我将它的取消标记与其他操作的10个cancellationtoken一起使用。将正在执行的操作链接到取消令牌的正确方法是什么?@Chris你没有,这就是重点。将其作为参数传递给方法。这些方法要么在每个循环步骤后检查它,要么在Cancel事件中添加一个事件处理程序,以便在Cancellation时执行它们想执行的任何操作,以链接不同的操作,您创建了一个新的CancellationTokenSource,它链接到父取消令牌,在父取消令牌与子令牌没有任何关系的情况下,如何定义父-子关系?最后的评论和回答非常棒(泰:)