同步运行任务的目的是什么以及何时执行

本文关键字:何时 执行 运行 任务 同步 是什么 | 更新日期: 2023-09-27 18:36:40

同步运行任务的目的是什么

public static void RunMeSync()
{
  for(int i = 0; i < 9999; i++)
  {
    ListBox1.Items.Add(i.ToString());
  }
}
public static void Main()
{
  Task T1 = new Task(()=>RunMeSync);
  T1.RunSynchronously();
  Task T2 = Task.Run(()=>RunMeSync);
}

这样做没有意义吗? 同步运行任务需要什么?
请考虑以下代码片段

public static void Main()
{
  Task T1 = new Task(()=>RunMeSync);
  T1.RunSynchronously();
  RunMeSync();
}

同步运行 T1 直接调用 RunMeSync 是一回事吗?

同步运行任务的目的是什么以及何时执行

T1同步运行,直接调用RunMeSync是同一件事吗?

是的,效果是一样的。通过同步运行从可以直接调用的方法构造的任务,您将不会获得任何好处。

但是,并非所有任务都是这样的:有些任务是从您无权访问的方法构造的 - 例如,作为参数传递到类的任务。在其他情况下,任务没有与之关联的命名方法,因为它是从 lambda 或匿名委托构造的。在所有这些情况下,RunSynchronously()提供了一种调用实现任务的逻辑的方法,而无需知道或担心该逻辑的定义方式。

Task本身只是一个工作单元 - 因此,它与它的运行方式无关。

完全

由您根据程序的需求、约束和上下文确定它的运行方式(尽管默认为可能并行运行)

RunSynchronously这个名字用词不当,更好的名字是TryToRunSynchronously。无论它运行哪个线程,方法都会等待任务完成,也许这就是他们选择这个名字的原因。

是的,顾名思义Task不会总是在当前线程中同步运行。如果基础计划程序拒绝内联,Task 仍将排队等待执行并等待其完成。TaskScheduler.TryExecuteTaskInline 决定任务是否是内联的候选者,决定任务内联的另一个参数是可用的堆栈量。因此,它与同步调用该方法不同

当您处理一些非常深的递归算法时,这可能会有所帮助。非常深的递归会导致StackOverflowException,你可以检查你是否有足够的堆栈来进行递归,如果不是只是在另一个线程中执行任务(事实上这就是它的实现方式)。

考虑我们正在并行化一些工作。我们将工作拆分到线程中,每个线程都执行一些深度递归,如果您使用传统的递归函数执行此操作,则最终会得到StackOverflowException。但是,如果将递归方法逻辑包装在Task.RunSynchronously中,则它将自动停止递归并将任务排队到底层调度程序,并在没有足够的可用堆栈时等待其完成。