将取消令牌传递给调用方法 VS 任务构造函数?
Passing cancellation token to calling method VS task constructor?
传递取消令牌的一种方法是:
/* Cancellation token passed as method parameter */
Task task = Task.Run( () => { LongTask(1000000, cancellationToken.Token); });
另一种方式是:
/* Cancellation Token passed as task constructor */
Task task = Task.Run( () => { LongTask(1000000); }, cancellationToken.Token);
有什么区别?
第一个方法将令牌传递给您的方法,您可以在其中使用它做任何您想做的事情。第二个将令牌传递给 Task.Run
,将任务与该令牌相关联。
由于 .NET 中的取消是合作的 Task.Run
只能在任务尚未开始执行时取消您的任务(这不是很有用)并且您的方法只能不时检查令牌并在请求取消时抛出,但这会将任务标记为错误而不是取消。
要获得完整的解决方案,您实际上应该同时执行这两项操作:
var task = Task.Run(() => LongTask(1000000, cancellationToken), cancellationToken);
这样任务就会与令牌相关联,您可以检查令牌是否已取消。
传递取消令牌的一种方法是:
/* Cancellation token passed as method parameter */
Task task = Task.Run( () => { LongTask(1000000, cancellationToken.Token); });
另一种方式是:
/* Cancellation Token passed as task constructor */
Task task = Task.Run( () => { LongTask(1000000); }, cancellationToken.Token);
有什么区别?
第一个方法将令牌传递给您的方法,您可以在其中使用它做任何您想做的事情。第二个将令牌传递给 Task.Run
,将任务与该令牌相关联。
由于 .NET 中的取消是合作的 Task.Run
只能在任务尚未开始执行时取消您的任务(这不是很有用)并且您的方法只能不时检查令牌并在请求取消时抛出,但这会将任务标记为错误而不是取消。
要获得完整的解决方案,您实际上应该同时执行这两项操作:
var task = Task.Run(() => LongTask(1000000, cancellationToken), cancellationToken);
这样任务就会与令牌相关联,您可以检查令牌是否已取消。