【发布时间】:2019-12-13 20:47:28
【问题描述】:
如何选择性地创建多个任务并使用await Task.WhenAll(a,b,c);执行它们
我有以下课程
public class TaskProcessor
{
private ProcessResult Result;
public TaskProcessor(ProcessResult result)
{
Result = result ?? throw new ArgumentNullException(nameof(result));
}
public async Task<ProcessResult> Process(TaskOption option)
{
// First optional task
Task<int?> typeFetcher = Task.FromResult<int?>(null);
if (option is IProcessType t)
{
typeFetcher = t.GetAsync();
}
// Second optional task
Task<int?> subtypeFetcher = Task.FromResult<int?>(null);
if (option is IProcessSubtype st)
{
subtypeFetcher = st.GetAsync();
}
// Third optional task
Task mainContent = Task.CompletedTask;
if(Result.Content != null)
{
mainContent = SetMainContentAsync(Result.Content);
}
await Task.WhenAll(typeFetcher, subtypeFetcher, mainContent);
Result.TypeId = typeFetcher.Result,
Result.SubtypeId = subtypeFetcher.Result;
return result;
}
}
我想将任务初始化为不执行任何操作的默认值。正如您在上面的代码中看到的,typeFetcher 任务使用Task.FromResult<int?>(null); 初始化,当给定的TaskOption 实现IProcessType 接口时,使用自定义任务覆盖该任务。 subtypeFetcher 任务的情况相同。
对于mainContent 任务,我使用Task.CompletedTask 对其进行了初始化,当Result.Content 不为空时,我将mainContent 设置为SetMainContentAsync(Result.Content)。最后,我使用await Task.WhenAll(typeFetcher, subtypeFetcher, mainContent) 等待所有任务。
ASP.NET Core Performance Best Practices 声明如下
不要:通过调用
Task.Wait或Task.Result来阻止异步执行。
由于我使用Task.FromResult<int?>(null); 来初始化任务,我觉得我违反了最佳实践。我想学习初始化可选任务的正确方法。
问题 初始化返回类型的可选任务的正确方法是什么?另外,初始化一个不返回任何东西到Task.CompletedTask 的任务是可以接受的还是有更正确的方法?
【问题讨论】:
-
审阅说明:
option is IProcessType t只能在option不是null时为真,因此t != null测试是多余的。 -
@madreflection 感谢您的提示!为了简单起见,我更新了代码
-
"由于我使用的是Task.FromResult
(null);来初始化任务,我觉得我违反了最佳实践。我想学习初始化一个可选的正确方法任务。”是非常令人困惑的陈述...不确定它与以前的报价有什么关系...
标签: c# asynchronous async-await task