同步运行任务的目的是什么以及何时执行?
what is the purpose of running task synchronously and when to do it?
同步运行任务的目的是什么
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是一回事吗?
一个 Task
本身只是一个工作单元 - 因此,它是不可知的 运行。
完全由您根据程序的需求、约束和上下文来确定它是如何 运行(尽管默认可能 运行 并发)
Is it the same thing running T1
Synchronously, invoking RunMeSync
directly?
是的,效果是一样的。 运行 同步地从可以直接调用的方法构建的任务不会获得任何收益。
然而,并非所有任务都是这样:有些任务是从您无权访问的方法构建的 - 例如,任务作为参数传递给您的 class。在其他情况下,任务将没有与之关联的命名方法,因为它是从 lambda 或匿名委托构造的。在所有这些情况下,RunSynchronously()
提供了一种调用实现任务的逻辑的方法,而无需知道或担心该逻辑的定义方式。
这个名字 RunSynchronously
有点用词不当,更好的名字是 TryToRunSynchronously
。方法无论如何都会等待任务完成,而不管它是哪个线程运行,也许这就是他们取这个名字的原因。
是的,顾名思义,Task
不会一直运行同步在当前线程中。如果底层调度程序拒绝内联,Task 仍将排队等待执行并等待其完成。 TaskScheduler.TryExecuteTaskInline 决定任务是否是内联的候选者,另一个决定任务内联的参数是可用堆栈的数量。所以和同步调用方法不一样
当您处理一些非常深的递归算法时,它可能会有所帮助。非常深的递归会导致WhosebugException
,你可以检查你是否有足够的堆栈来进行递归,如果没有就在另一个线程中执行任务(实际上它是如何实现的)。
假设我们正在并行化一些工作。我们跨线程拆分工作,每个线程都进行一些深度递归,如果您使用传统的递归函数执行此操作,您最终会得到 WhosebugException
。但是,如果你将递归方法逻辑包装在 Task.RunSynchronously
中,那么它会自动停止递归并将任务排队到底层调度程序,如果没有足够的可用堆栈,则等待它完成。
同步运行任务的目的是什么
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是一回事吗?
一个 Task
本身只是一个工作单元 - 因此,它是不可知的 运行。
完全由您根据程序的需求、约束和上下文来确定它是如何 运行(尽管默认可能 运行 并发)
Is it the same thing running
T1
Synchronously, invokingRunMeSync
directly?
是的,效果是一样的。 运行 同步地从可以直接调用的方法构建的任务不会获得任何收益。
然而,并非所有任务都是这样:有些任务是从您无权访问的方法构建的 - 例如,任务作为参数传递给您的 class。在其他情况下,任务将没有与之关联的命名方法,因为它是从 lambda 或匿名委托构造的。在所有这些情况下,RunSynchronously()
提供了一种调用实现任务的逻辑的方法,而无需知道或担心该逻辑的定义方式。
这个名字 RunSynchronously
有点用词不当,更好的名字是 TryToRunSynchronously
。方法无论如何都会等待任务完成,而不管它是哪个线程运行,也许这就是他们取这个名字的原因。
是的,顾名思义,Task
不会一直运行同步在当前线程中。如果底层调度程序拒绝内联,Task 仍将排队等待执行并等待其完成。 TaskScheduler.TryExecuteTaskInline 决定任务是否是内联的候选者,另一个决定任务内联的参数是可用堆栈的数量。所以和同步调用方法不一样
当您处理一些非常深的递归算法时,它可能会有所帮助。非常深的递归会导致WhosebugException
,你可以检查你是否有足够的堆栈来进行递归,如果没有就在另一个线程中执行任务(实际上它是如何实现的)。
假设我们正在并行化一些工作。我们跨线程拆分工作,每个线程都进行一些深度递归,如果您使用传统的递归函数执行此操作,您最终会得到 WhosebugException
。但是,如果你将递归方法逻辑包装在 Task.RunSynchronously
中,那么它会自动停止递归并将任务排队到底层调度程序,如果没有足够的可用堆栈,则等待它完成。