CancellationToken和Task的问题

好几只小萝莉 2020-11-05 11:00:13

var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
Task.Run(() =>
{
while (true)
{
token.ThrowIfCancellationRequested();
Console.WriteLine($"[1] {DateTime.Now:mm:ss.fff}");
Thread.Sleep(1000);
}
}, token);
Task.Run(() =>
{
Thread.Sleep(5000);
Console.WriteLine($"[2] {DateTime.Now:mm:ss.fff}");
tokenSource.Cancel();
});


在Task.Run方法中,第二个参数CancellationToken加不加效果都一样。
要取消还是得有一句"token.ThrowIfCancellationRequested();"。


也就是
Task.Run(action)

Task.Run(action,token)
有什么区别?

想知道Task.Run的第二个参数的作用是什么?通常在怎么场景下使用?


...全文
3769 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
好几只小萝莉 2020-11-07
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:
他是两种时态 1。现在进行时 2。将来进行时 线程并不是时时刻刻运行,线程由系统调度。token是运行令牌,拿着牌子的进,没牌子的不进 但是你现在已经进去的呢?他会执行完本轮调度时间。 通常我们说没有啥区别,一轮调度10多ms。对一般程序而言是立刻结束,还是下一轮结束,几乎没影响
谢谢老铁,讲得晦涩却直指核心。 这里写个demo做一下记录

var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
for (int i = 0; i < 10000; i++)
{
    var num = i + 1;
    Task.Run(() =>
    {
        while (true)
        {
            Console.WriteLine($"[{num}.A] {DateTime.Now:mm:ss.fff}");
            token.ThrowIfCancellationRequested();
            Console.WriteLine($"[{num}.B] {DateTime.Now:mm:ss.fff}");
            Thread.Sleep(1000);
        }
    }, token);
}
tokenSource.Cancel();
Console.WriteLine($"Cancel!");
wanghui0380 2020-11-06
  • 打赏
  • 举报
回复
正常情况我不加1,用2。 就像我说的,线程一个时间片其实运行不了几ms,所以就是这个几ms木结束,下个时间片他也进不去 但是反过来,加1木2,意思是下个时间片我一样进,不是由系统根据令牌调度,而是你自己判定令牌
wanghui0380 2020-11-06
  • 打赏
  • 举报
回复
他是两种时态 1。现在进行时 2。将来进行时 线程并不是时时刻刻运行,线程由系统调度。token是运行令牌,拿着牌子的进,没牌子的不进 但是你现在已经进去的呢?他会执行完本轮调度时间。 通常我们说没有啥区别,一轮调度10多ms。对一般程序而言是立刻结束,还是下一轮结束,几乎没影响

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧