使用两个没有等待的Task.Run会让它们并行运行吗?

时间:2016-10-07 08:45:49

标签: c# asynchronous parallel-processing

我刚刚开始在异步编程中蘸我的脚趾。我试着阅读很多关于Task.Run的内容,但我不清楚一个问题。

如果我有两个连续的语句使用Task.Run,​​没有等待,那两个会并行运行吗?

代码示例:

Task.Run(()=> function1);
Task.Run(()=> function2);

因为我想要一个非阻塞调用,所以Parallel.Invoke不是一个选项。我也不想等待上下文,所以等待Task.Run是没有意义的。这是一个很好的解决方法吗?

3 个答案:

答案 0 :(得分:2)

它们可能并行运行,是的。

当然,这假设有资源允许它们并行运行 - 例如,你有足够的免费线程池线程,你有多个执行单元,它们不会在同一个I / O上阻塞...

请注意,即使您没有等待这些任务,保持Task引用通常很有用 - 例如用于错误处理,完成通知等。纯粹的火灾和遗忘操作相当罕见。

答案 1 :(得分:0)

static void Main(string[] args)
    {
        Task.Run(() => function1());
        Task.Run(() => function2());
    }

    private static void function2()
    {
        //throw new NotImplementedException();
    }

    private static void function1()
    {
        while (true)
        {

        }
    }

只需使用断点运行此代码,您将看到两个方法将异步运行。但这一切都取决于ThreadPool调度。

答案 2 :(得分:-1)

这个问题没有正确答案。当您调用Task.Run(..)时 - 您将操作传递给具有自己的调度程序的线程池。该调度程序将决定何时运行您的操作。因此,它可以并行运行几个,但有时不会。如果你真的想要运行并行的东西,你应该使用Thread或像Parallel Extensions这样的东西。

更新。要启动单独的帖子,您可以使用

var thread = new Thread((() => { /*...*/ }));
thread.Start();

BUT!请注意,对于短时操作以及必须运行许多任务时 - 使用线程并不是一个好的选择。在那种情况下Task.Run - 会更好。通常,我建议仅将Threads用于长时间运行的计算操作。