gpt4 book ai didi

c# - 直接调用 anon async Func 与使用 Task.Factory 之间的区别?

转载 作者:太空宇宙 更新时间:2023-11-03 21:12:43 25 4
gpt4 key购买 nike

这两个代码片段有什么区别?如果我们有以下匿名函数:

Func<object, Task<bool> foo = async (str) => { /*misc async code with awaits*/ return result};

和直接调用有什么区别:

Task<bool> bar = foo("myparam");

并使用任务:

Task<bool> bar = Task.Factory.StartNew(foo, "myparam").Unwrap();

本质上,它们都是异步执行的,但是以一种方式执行的优缺点是什么?他们都返回任务。返回的任务有何不同? (例如一个是多线程,而另一个是单线程等)

最佳答案

In essence, they both execute asynchronously, but what are the pro's/con's of doing it one way over the other?

直接调用方法会在当前线程异步执行。被调用的方法将继承调用方法的上下文,并将使用当前的 SynchronizationContext(或者,如果是 null,则使用当前的 TaskScheduler ) 恢复执行。 I explain this in full on my blog .

通过 StartNew 调用该方法将在当前 TaskScheduler 上异步执行。通常,这是线程池任务调度程序,除非调用代码作为 Delegate Task 的一部分执行。 (在我的博客上定义的术语)。除非那个任务是 started with the HideScheduler option (在我的博客上有描述),在这种情况下没有当前的 TaskScheduler,即使有一个 TaskScheduler 正在执行该代码。

如果 StartNew 场景听起来很复杂,那是因为它确实很复杂。 StartNew 仅供专家使用。我在 why StartNew should not be used 上有一整篇博文.

更现实的比较是直接调用方法和通过 Task.Run 调用方法。与 StartNew 不同,Task.Run 始终在线程池线程上执行其代码,因此该方法将在线程池上异步运行。

对于真实世界的代码,您应该只在需要时使用 Task.Run。如果该方法是正确异步的(即,它不首先计算分形或其他任何东西),那么您不应该使用 Task.Run。而且您根本不应该使用 StartNew

关于c# - 直接调用 anon async Func 与使用 Task.Factory 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36608132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com