相关疑难解决方法(0)

何时使用Task.Delay,何时使用Thread.Sleep?

什么时候使用Task.DelayThread.Sleep有很好的规则?

  • 具体来说,是否有一个最小值来提供一个有效/高效的另一个?
  • 最后,由于Task.Delay导致异步/等待状态机上下文切换,是否有使用它的开销?

c# multithreading task-parallel-library

343
推荐指数
5
解决办法
20万
查看次数

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

我正在整理一个小小的演示来采用模拟的长时间运行方法,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;
}
Run Code Online (Sandbox Code Playgroud)

我以为我可以简单地Thread.Sleep(1000)改成a new 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;
}
Run Code Online (Sandbox Code Playgroud)

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

c# multithreading asynchronous thread-sleep

3
推荐指数
1
解决办法
2985
查看次数