我正在做一些异步操作,我想使用CancellationToken来阻止异步任务运行,如果用户例如请求它。为了做到这一点,最好有一个Dictionary,我可以找到正确的Thread来停止正确的操作?我目前正在关注的是:
public Dictionary<Thread, CancellationToken> CancellationTokenData;
因此,如果用户请求取消操作,如果我没有错,它应该表现正确吗?
执行此操作的最佳做法是什么?
例如,假设用户使用线程{B}在数据库内的集合{A}上执行一些非常长的操作。然后他取消操作并继续使用来自另一个线程的集合{A}的另一个冗长的操作。我应该为当前CancellationToken
使用全局变量吗?
答案 0 :(得分:16)
通常,每个操作都有一个CancellationTokenSource
可取消。您将CancellationTokenSource传递给可能需要取消操作的所有人(cts.Cancel()
),并将CancellationToken
(cts.Token
)传递给需要知道取消的所有人。
在这个抽象级别,你不会停止线程;你停止了操作。线程只是实现细节。
因此,我认为将令牌映射到线程并不是一个好主意。如果涉及任务,这是一个非常糟糕的主意,因为无法保证每个任务实际上都在新线程上运行。