【发布时间】:2022-02-10 18:53:59
【问题描述】:
我想了解CancellationToken 的工作原理,以及它如何取消任务。
为此,我创建了这个示例,它对 Task.Run() 和内部方法使用相同的标记 - HelpDoingSomething()
所以,我让任务运行500ms,然后我取消token,结果是:
第一个打印消息:“HelpDoingSomething cancelled”,然后 “DoSomething cancelled”
class Program
{
static void Main(string[] args)
{
var cts = new CancellationTokenSource();
var myClass = new MyClass(cts.Token);
myClass.DoSomething();
Thread.Sleep(500);
cts.Cancel();
System.Console.ReadKey();
}
}
internal class MyClass
{
private CancellationToken token;
public MyClass(CancellationToken token)
{
this.token = token;
}
public void DoSomething()
{
Task.Run(() =>
{
HelpDoingSomething();
System.Console.WriteLine("DoSomething cancelled");
}, token);
}
private void HelpDoingSomething()
{
while (!token.IsCancellationRequested)
{
//Keep doing something
System.Console.Write(".");
}
System.Console.WriteLine("HelpDoingSomething cancelled");
}
}
我确切地知道我的方法HelpDoingSomething() 检查是否在循环的每次迭代中都请求了cancellationToken。
我的问题是Task.Run() 方法检查是否请求取消令牌的频率和频率?
Task.Run() 是否可能会在 HelpDoingSomething() 之前检查,而我只会看到一条消息打印(“DoSomething cancelled”)?这意味着该方法可能无法正确处理逻辑。
【问题讨论】:
-
由于取消需要“向上”冒泡(以停止所有子任务),在抛出 DoSomething 取消之前抛出 HelpDoingSomething 是正常的,但您会问一个完全不同的问题。你的问题是什么?它被调用的频率,它不是一个及时的过程,它是一个完全不同的球场(在不同大陆的另一个国家) - Task.Run 不会主动寻找取消,它们会被发布。
-
您不可能看到该输出。
DoSomething cancelled出现的唯一方法是HelpDoingSomething cancelled也被执行。如果在此之前有异常,则两者都不会出现。Task.Run在函数启动后不检查任何内容,然后由您检查令牌。它只在开始任务之前检查它 -
@riffnl,我的问题不仅是“多久”,还有“如何”。我想了解它是如何工作的。
标签: c# .net task cancellationtokensource cancellation-token