我可以假设doTask
和doTask2
做同样的工作并且可能会在代码中被替换吗?
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));
});
}
根据我的实验,两个函数的行为相同。
答案 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
。