【问题标题】:How Task.WaitAll() Behave?Task.WaitAll() 如何表现?
【发布时间】:2017-06-12 02:36:24
【问题描述】:

我创建了一个Task 列表,如下所示:

public void A()
{

}

public void B()
{

}

public void C()
{

}

public void Ex()
{
   Task.WaitAll(Task.Factory.StartNew(A), Task.Factory.StartNew(B), Task.Factory.StartNew(C));
   var p=true;
}

现在我的问题是。列表中的所有Task是一个一个执行还是并行执行。

p=真

“p”是在所有任务完成时设置还是在它们完成之前设置?

【问题讨论】:

    标签: c# c#-5.0


    【解决方案1】:

    第一个问题:

    这些任务是一一执行还是异步执行。

    (这里,我想你的意思是并发,这不完全一样)

    使用StartNew 将在当前TaskScheduler 中运行您的任务。默认情况下,这意味着它将使用ThreadPool,如果线程池中有任何可用的插槽,它将并行运行。如果任务池中的所有槽都被占用,它可能会限制任务的执行以避免CPU不堪重负,并且任务可能不会同时执行:没有保证。

    这是一个简化的解释,关于调度策略的更完整和详细的解释是explained on the TaskScheduler documentation

    作为旁注。 documentation for StartTask 提到了 StartNew(Action)Run(Action) 之间的细微差别。与其他答案中所述不同,它们并不完全相同。

    从 .NET Framework 4.5 开始,您可以使用 Task.Run(Action) 方法作为使用默认参数调用 StartNew(Action) 的快捷方式。但是请注意,两种方法之间的行为存在差异: Task.Run(Action) 默认情况下不允许使用 TaskCreationOptions.AttachedToParent 选项启动的子任务附加到当前 Task 实例,而 StartNew(Action)做。

    关于第二个问题

    “p”是在所有任务完成时设置还是在它们完成之前设置?

    简短的回答是肯定的。

    但是,您应该考虑使用另一种方法,因为这种方法会阻塞您的线程并闲置等待。另一种方法是在可以的情况下将控制权交还给调用者,这样线程就会被释放并可供 CPU 使用。如果运行此代码的线程是 ThreadPool 的一部分,则尤其如此。

    因此,您应该更喜欢using WhenAll()。它返回一个Task,可以等待或调用ContinueWith

    示例:

    var tasks = new Task[] {Task.Factory.StartNew(A), Task.Factory.StartNew(B), Task.Factory.StartNew(C)}; 
    await Task.WhenAll(tasks);
    

    【讨论】:

    • 当然,我的错。 TaskPool 存在,但它是一个响应式扩展概念。很抱歉造成混乱。
    【解决方案2】:

    首先: 您正在以错误的方式创建任务。当您实例化一个任务时,您需要对其调用 Start 方法,否则它不会执行任何操作。

    new Task(() => /* Something * /).Start();
    

    如果您以刚才的方式创建任务(通过调用构造函数并点击启动或使用 TaskFactry 甚至 Task.Run),默认情况下,一个 ThreadPool 线程将专用于该任务,因此该任务是并行执行的。

    Task.WhenAll 方法将阻塞调用方法的执行,直到传递给它的所有任务都执行完毕。

    所以在所有任务完成后设置布尔变量。

    【讨论】:

    • 是的,我刚刚更改了 Task.Factory.StartNew(A) 。这样可以吗?
    • 是的,但首选方法是使用 Task.Run,​​它针对大多数基本场景进行了优化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多