同时运行任务 .NET 4.5

3
为什么 AwakeTest 方法需要三秒钟而不是一秒钟?
public static async void AwakeTest()
{
    var Do1 = Sleep(1, 1);
    var Do2 = Sleep(1, 2);
    var Do3 = Sleep(1, 3);

    await System.Threading.Tasks.Task.WhenAll(Do1, Do2, Do3); 

    Console.WriteLine(await Do1);
    Console.WriteLine(await Do2);
    Console.WriteLine(await Do3);
}

private static async System.Threading.Tasks.Task<int> Sleep(int Seconds, int ID)
{
    if (Seconds < 0)
    {
        throw new Exception();
    }
    System.Threading.Thread.Sleep(Seconds * 1000);
    return ID;
}

请查看此链接:https://dev59.com/XWct5IYBdhLWcg3wPLCB - Mihail Shishkov
1个回答

11

Thread.Sleep 会使线程休眠,而每个 Task 不需要在单独的线程中运行,它会挂起整个线程。

你应该使用 Task.Delay 替代:

await Task.Delay(Seconds * 1000);

1
我本来期望Do1Do2Do3会在不同的线程中处理,谢谢! - fubo
我认为这个链接的问题与此无关。它是关于TaskFactory.StartNew或其相关方法的,而不仅仅是异步方法。 - Sriram Sakthivel
@SriramSakthivel:好的,但他是将它们作为任务运行的,对吗?他调用了 System.Threading.Tasks.Task.WhenAll - Patrick Hofman
这并不意味着它也是相关的。例如,您可以编写 await Task.WhenAll(Task.FromResult(1), Task.FromResult(2), ...);。在这里,OP已经知道没有线程参与。仅使用任务并不意味着它与线程有关。在我看来,链接的答案与此问题无关。 - Sriram Sakthivel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接