如何使用 C# 初始化可选的 Task 和 Task<T>?

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它不为空时,我将它设置mainContentSetMainContentAsync(Result.Content)。最后,我使用await Task.WhenAll(typeFetcher, subtypeFetcher, mainContent).

ASP.NET核心性能最佳实践规定如下

不要:通过调用Task.Wait或 来阻止异步执行Task.Result

由于我使用Task.FromResult<int?>(null);初始化任务,我觉得我违反了最佳实践。我想学习初始化可选任务的正确方法。

问题初始化返回类型的可选任务的正确方法是什么?另外,是否正在初始化一个不会返回任何内容的任务,Task.CompletedTask或者是否有更正确的方法?

ILM*_*tan 6

你在做什么很好。Task.FromResult不是Task.Result,两者完全无关。

Task.Result 是一个实例属性,它阻塞当前线程直到任务完成,并返回任务的结果。

Task.FromResult 是一个静态方法,它返回一个微不足道的、已经完成的任务。