从Thread.Sleep()创建Task.Delay()

时间:2017-11-09 16:06:20

标签: c# multithreading

我可以假设doTaskdoTask2做同样的工作并且可能会在代码中被替换吗?

    public async static void doTask()
    {
        await Task.Delay(TimeSpan.FromSeconds(5));
    }


    public async static void doTask2()
    {
        await Task.Factory.StartNew(() =>
        {
            Thread.Sleep(TimeSpan.FromSeconds(5));
        });
    }

根据我的实验,两个函数的行为相同。

1 个答案:

答案 0 :(得分:0)

其中一个非常重要的区别是Thread.Sleep()在一段时间内阻塞了线程,意味着线程将无法用于线程池,而Task.Delay()创建一个任务并立即释放线程,所以其他任务可以使用该线程。

Thread.Sleep可能很容易导致线程饥饿

要演示(请注意我已将回复类型更改为Task):

static void Main(string[] args)
{
    Task.WaitAll(Enumerable.Range(0, 1000).Select(o => doTask()).ToArray());
    Console.WriteLine("1");
    Task.WaitAll(Enumerable.Range(0, 1000).Select(o => doTask2()).ToArray());
    Console.WriteLine("2");
}

public async static Task doTask() => await Task.Delay(TimeSpan.FromSeconds(1));
public async static Task doTask2() => await Task.Factory.StartNew(() => Thread.Sleep(TimeSpan.FromSeconds(1)));

您会很快看到1,但{strong}需要很多时间(在我的8核CPU上几分钟)才能显示{。}}。

经验法则:使用线程 - 使用2,使用任务 - 坚持Thread.Sleep