Cancellation Token 来源示例
Cancellation Token source example
我正在执行一些异步操作,我想使用 CancellationToken 来停止来自 运行 的异步任务,例如如果用户请求这样做。为此,拥有一个可以找到正确线程以停止正确操作的字典是一种好习惯吗?我目前正在查看的内容如下:
public Dictionary<Thread, CancellationToken> CancellationTokenData;
因此,如果用户请求取消某个操作,如果我没记错的话,它应该会正确运行?
执行此操作的最佳做法是什么?
例如,假设用户使用线程 {B} 对数据库中的集合 {A} 执行了一些非常长的操作。然后他取消了操作并从另一个线程开始对集合 {A} 使用另一个冗长的操作。我应该为当前 CancellationToken
使用全局变量吗?
通常,每个操作有一个 CancellationTokenSource
是可取消的。您将 CancellationTokenSource 传递给可能需要取消操作的每个人 (cts.Cancel()
),并将它的 CancellationToken
(cts.Token
) 传递给需要知道取消操作的每个人。
在这个抽象级别,您不会停止线程;你停止操作。线程只是实现细节。
因此,我认为将令牌映射到线程不是一个好主意。如果涉及任务,这是一个非常糟糕的主意,因为不能保证每个任务实际上都在一个新线程上运行。
我正在执行一些异步操作,我想使用 CancellationToken 来停止来自 运行 的异步任务,例如如果用户请求这样做。为此,拥有一个可以找到正确线程以停止正确操作的字典是一种好习惯吗?我目前正在查看的内容如下:
public Dictionary<Thread, CancellationToken> CancellationTokenData;
因此,如果用户请求取消某个操作,如果我没记错的话,它应该会正确运行?
执行此操作的最佳做法是什么?
例如,假设用户使用线程 {B} 对数据库中的集合 {A} 执行了一些非常长的操作。然后他取消了操作并从另一个线程开始对集合 {A} 使用另一个冗长的操作。我应该为当前 CancellationToken
使用全局变量吗?
通常,每个操作有一个 CancellationTokenSource
是可取消的。您将 CancellationTokenSource 传递给可能需要取消操作的每个人 (cts.Cancel()
),并将它的 CancellationToken
(cts.Token
) 传递给需要知道取消操作的每个人。
在这个抽象级别,您不会停止线程;你停止操作。线程只是实现细节。
因此,我认为将令牌映射到线程不是一个好主意。如果涉及任务,这是一个非常糟糕的主意,因为不能保证每个任务实际上都在一个新线程上运行。