这两种方法几乎是同时开始的吗?

时间:2017-11-28 09:22:38

标签: c# asynchronous

当我在代码下面运行时,输出是这样的: Output when printed till 500 当我跑到300时,输出是这样的: Output when printed till 300 当我跑到100时,输出是这样的: Output when printed till 100

这是否意味着两种方法几乎同时开始?

如果这是真的,如果我们可以通过async-await实现并行性,为什么还需要并行库?

using System;
using System.Threading.Tasks;


class Program
{
    public static void PrintX()
    {
        for (int i = 0; i < 500; i++) { Console.Write("x"); }
    }

    public static void PrintY()
    {
        for (int i = 0; i < 500; i++) { Console.Write("y"); }
    }

    public async Task RunAsync()
    {
        var t1 = Task.Run(() => PrintY());
        var t2 = Task.Run(() => PrintX());
        await t1;
        await t2;
    }

    static void Main(string[] args)
    {
        Task t = new Program().RunAsync();
        t.Wait();
    }
}

1 个答案:

答案 0 :(得分:4)

最终你在这里受到线程池的支配。您已将两个项目(Task.Run)排队,并且将在未来某个时间接收并提供服务。当它们启动时是非确定性的,并且将取决于有多少可用线程以及其他因素。

他们将同时开始大约,不保证任何事情(甚至可能不是他们开始的顺序)。 await将针对完成触发 - 所以 时调用await(甚至 是否 您致电await)不会以任何方式影响他们。它们可能并行运行,但很可能它们单独运行得足够快,无论哪个首先启动都会在尝试启动第二个之前完成。它们甚至可能最终在同一个线程上连续运行(输出托管线程ID将是一种查看此方法的方法)。

至于为什么我们需要Parallel:首先,它会在async / await之前很长时间;其次,它允许更大规模的并行化做很多事情 - 比如运行包含固定最大并行化的并发处理的大序列。

只是为了表明可以是并发的,这是我将Environment.CurrentManagedThreadId添加到输出中的实际运行的输出:

main: 1
y: 3
x: 4
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

绝对是并发的,但是:其他运行可以显示非常不同的输出