加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Task.Delay()和新任务之间的区别(()=> Thread.Sleep())

发布时间:2020-12-16 00:25:01 所属栏目:百科 来源:网络整理
导读:我正在整理一个小小的演示,以便使用Thread.Sleep()模拟一个长时间运行的方法,并希望添加异步以轻松地从同步过程转到异步过程.这是初始代码: private void button1_Click(object sender,EventArgs e){ LongProcess();}private void LongProcess(){ for (int
我正在整理一个小小的演示,以便使用Thread.Sleep()模拟一个长时间运行的方法,并希望添加异步以轻松地从同步过程转到异步过程.这是初始代码:

private void button1_Click(object sender,EventArgs e)
{
    LongProcess();
}

private void LongProcess()
{
    for (int i = 0; i < 33; i++)
    {
        progressBar1.Value += 3;
        Thread.Sleep(1000);
    }
    progressBar1.Value += 1;
}

我以为我可以简单地将Thread.Sleep(1000)更改为新的Task(()=> Thread.Sleep(1000)),如下所示:

private void button1_Click(object sender,EventArgs e)
{
    LongProcess();
}

private async void LongProcess()
{
    for (int i = 0; i < 33; i++)
    {
        progressBar1.Value += 3;
        await new Task(()=>Thread.Sleep(1000));
    }
    progressBar1.Value += 1;
}

然而,在第一次等待之后,这永远不会返回到循环.如果我将Thread.Sleep更改为Task.Delay一切正常,但我不明白为什么我的代码不起作用.我认为某些东西会永远被阻挡,但它并没有多大意义.任何人都可以解释我的代码如何工作,以及一个可能的解决方案,而无需更改为Task.Delay(只是这样我可以得到另一个视角,如何工作)?

解决方法

Task.Delay与使用Thread.Sleep启动任务不同. Task.Delay在内部使用Timer,因此它不会阻塞任何线程,但是使用Thread.Sleep启动新的任务会阻塞线程(通常是Threadpool线程).

在您的示例中,您从未启动过任务.使用构造函数创建任务将返回需要通过调用Start方法启动的Unstarted任务.否则它永远不会完成(因为你从未开始它).

但是不鼓励调用Task.Start,如果你想调用Task.Factory.StartNew(()=> Thread.Sleep(1000))或Task.Run(()=> Thread.Sleep(1000))浪费资源.

此外,请注意StartNew is dangerous,除了有令人信服的理由之外,你应该更喜欢Task.Run而不是StartNew.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读