Task.whenall vs Task.GetAwaiter().GetResult() 在非常任务上
Task.whenall vs Task.GetAwaiter().GetResult() on very task
我是否使用以下方法创建了 Task
:
Task.Factory.StartNew<GroupPreferenceList>(())
并调用一个函数,就像我有 7 个方法,所有方法都包含一个或两个 API 调用。现在我正在使用:
Task.GetAwaiter().GetResult()
在非常任务上获取非常任务的结果并对其进行一些操作。
我的问题是我是否应该创建另一个并使用 WhenAll()
或者我正在做的是正确且更快的。
谢谢
这方面有几点:
- 使用
Task.Run<GroupPreferenceList>(())
而不是 Task.Factory.StartNew<GroupPreferenceList>(())
,这是 Stephen Cleary StartNew is Dangerous 提供的有用信息
- 除此之外你为什么需要
Task.GetAwaiter().GetResult()
,我可以理解在等待的任务上使用 GetAwaiter()
,但这在这里没有用例。此外,每个调用都将在主线程上进行,从而消除了并发和等待获取每个已执行任务结果的好处
- 当您想为所有任务集合获取单个代表任务并等待它时,您可以使用
WhenAll()
在这种情况下我的建议是:
- 只需使用
Task.Run
为每个任务创建一个任务集合
- 执行
Task.WaitAll
以等待它们中的每一个完成,然后访问任务对象的每个 Result
调用的结果,前提是您使用通用版本作为基础 class Task
的人没有。
上面的回答是在你需要TPL处理的前提下,如果是IO并发,那就把complete call转成Async-Await,因为这样最适合IO并发
我是否使用以下方法创建了 Task
:
Task.Factory.StartNew<GroupPreferenceList>(())
并调用一个函数,就像我有 7 个方法,所有方法都包含一个或两个 API 调用。现在我正在使用:
Task.GetAwaiter().GetResult()
在非常任务上获取非常任务的结果并对其进行一些操作。
我的问题是我是否应该创建另一个并使用 WhenAll()
或者我正在做的是正确且更快的。
谢谢
这方面有几点:
- 使用
Task.Run<GroupPreferenceList>(())
而不是Task.Factory.StartNew<GroupPreferenceList>(())
,这是 Stephen Cleary StartNew is Dangerous 提供的有用信息
- 除此之外你为什么需要
Task.GetAwaiter().GetResult()
,我可以理解在等待的任务上使用GetAwaiter()
,但这在这里没有用例。此外,每个调用都将在主线程上进行,从而消除了并发和等待获取每个已执行任务结果的好处 - 当您想为所有任务集合获取单个代表任务并等待它时,您可以使用
WhenAll()
在这种情况下我的建议是:
- 只需使用
Task.Run
为每个任务创建一个任务集合 - 执行
Task.WaitAll
以等待它们中的每一个完成,然后访问任务对象的每个Result
调用的结果,前提是您使用通用版本作为基础 classTask
的人没有。
上面的回答是在你需要TPL处理的前提下,如果是IO并发,那就把complete call转成Async-Await,因为这样最适合IO并发