Cancellation Token 来源示例

Cancellation Token source example

我正在执行一些异步操作,我想使用 CancellationToken 来停止来自 运行 的异步任务,例如如果用户请求这样做。为此,拥有一个可以找到正确线程以停止正确操作的字典是一种好习惯吗?我目前正在查看的内容如下:

    public Dictionary<Thread, CancellationToken> CancellationTokenData;

因此,如果用户请求取消某个操作,如果我没记错的话,它应该会正确运行?

执行此操作的最佳做​​法是什么?

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

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

在这个抽象级别,您不会停止线程;你停止操作。线程只是实现细节。

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