0 c# asynchronous task async-await
如何有选择地创建多个任务并使用它们执行 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我想将任务初始化为不执行任何操作的默认值。正如你在上面的代码中看到的,typeFetcher任务是使用初始化的Task.FromResult<int?>(null);,当给定的TaskOption实现IProcessType接口时,任务被自定义任务覆盖。相同的场景意味着该subtypeFetcher任务。
对于mainContent任务,我使用 a 初始化它Task.CompletedTask,当Result.Content它不为空时,我将它设置mainContent为SetMainContentAsync(Result.Content)。最后,我使用await Task.WhenAll(typeFetcher, subtypeFetcher, mainContent).
在ASP.NET核心性能最佳实践规定如下
不要:通过调用
Task.Wait或 来阻止异步执行Task.Result。
由于我使用Task.FromResult<int?>(null);初始化任务,我觉得我违反了最佳实践。我想学习初始化可选任务的正确方法。
问题初始化返回类型的可选任务的正确方法是什么?另外,是否正在初始化一个不会返回任何内容的任务,Task.CompletedTask或者是否有更正确的方法?
你在做什么很好。Task.FromResult不是Task.Result,两者完全无关。
Task.Result 是一个实例属性,它阻塞当前线程直到任务完成,并返回任务的结果。
Task.FromResult 是一个静态方法,它返回一个微不足道的、已经完成的任务。
| 归档时间: |
|
| 查看次数: |
507 次 |
| 最近记录: |