取消令牌源示例

5

我正在进行一些异步操作,希望使用CancellationToken在用户请求时停止异步任务的运行。为了做到这一点,是否有一个好的实践方法可以使用字典来查找正确的线程以停止正确的操作?我目前正在考虑以下内容:

    public Dictionary<Thread, CancellationToken> CancellationTokenData;

因此,如果用户请求取消操作,如果我没有错的话,它应该正确执行,对吧?

有哪些最佳实践方法可以做到这一点?

例如,假设用户在使用线程 {B} 在数据库中的集合 {A} 上执行某些非常耗时的操作,然后取消操作并转而在另一个线程上使用集合 {A} 进行另一个耗时操作。我应该为当前的 CancellationToken 使用全局变量吗?


我不能说我理解你在问什么,但取消操作非常简单,没有任何理由去跟踪线程。您可以创建一个 CancellationTokenSource 对象,并将其令牌传递给任何长时间运行的操作,例如接受取消令牌的任何方法。客户端调用“source”以中止操作,源对象会向令牌发送信号,监视此信号的操作会优雅地终止。这是操作/方法终止,而不是线程。没有“当前”的令牌,您可以将同一个令牌传递给多个操作。 - Panagiotis Kanavos
@PanagiotisKanavos 好的,但是你是否使用本地变量来实现这个?如果我使用本地变量,我会受到太多限制,只能在当前方法内调用它,如果我将其用作全局变量,事情可能会变得混乱。我应该为每个变量都有一个全局变量吗?希望我们在同一条轨道上。 - Christo S. Christov
我理解你的意思是线程之间存在依赖关系?那么当然必须为它们使用相同的令牌-使用字典没有任何意义... - Thomas Weller
这是否意味着一个取消令牌可以同时映射到多个操作?@PanagiotisKanavos不,线程之间没有依赖关系。Thomas - Christo S. Christov
1个回答

18
通常,对于可取消的操作,您会拥有一个CancellationTokenSource。您将CancellationTokenSource传递给任何可能需要取消操作的人(cts.Cancel()),并将其CancellationTokencts.Token)传递给所有需要了解取消操作的人。
在这个抽象级别上,您不会停止线程;您停止操作。线程只是实现细节。
因此,我认为将令牌映射到线程并不是一个好主意。如果涉及任务,则这是非常糟糕的想法,因为不能保证每个任务实际上在一个新线程上运行。

好的,那么你通常是如何将 CancellationToken 映射到操作的呢? - Christo S. Christov
例如,假设我想停止执行操作A,并且我有它的取消令牌以及其他10个操作的取消令牌。如何正确地将正在执行的操作与取消令牌链接起来? - Christo S. Christov
@Chris,你不需要这样做,这就是重点。你需要将它作为参数传递给方法。方法可以在每个循环步骤后检查它,或者添加一个事件处理程序来执行取消操作时想要执行的任何操作。 - Panagiotis Kanavos
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Panagiotis Kanavos
在父母与子代标记之间没有任何关系的情况下,如何定义父子关系?最后一条评论和回答提供了很好的信息,谢谢 :) - Christo S. Christov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接