取消令牌源示例

时间:2015-02-11 15:37:46

标签: c# asynchronous

我正在做一些异步操作,我想使用CancellationToken来阻止异步任务运行,如果用户例如请求它。为了做到这一点,最好有一个Dictionary,我可以找到正确的Thread来停止正确的操作?我目前正在关注的是:

    public Dictionary<Thread, CancellationToken> CancellationTokenData;

因此,如果用户请求取消操作,如果我没有错,它应该表现正确吗?

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

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

1 个答案:

答案 0 :(得分:16)

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

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

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