首页 > 解决方案 > 任务和返回类型

问题描述

我有一个关于任务的问题。我知道我们应该选择Task是否需要等待方法,void是否不需要它,以及Task<T>是否要返回一些东西。对?现在我正在使用Task<T>并获取List<Article>从 API 返回的参数并返回return Task.CompletedTask;但是我不完全确定这是正确的。

async Task<Task> FillAnonymousArticles(List<Article> articles)
{
    foreach (var article in articles)
    {
        var filename = string.Format(SharedConstants.ArticleImageUrl, SharedConstants.ApiBaseUri, article.Id);
        var newCell = new ArticleDetailData()
        {
            Author = article.Author,
            BackgroundImage = filename,
            Id = article.Id,
            Subtitle = article.Description,
            Title = article.Name,
        };
        var sec = article.Category;
        if (sec == null)
        {
            newCell.Section = " ";
        }
        else
        {
            newCell.Section = article.Category;
        }
    }
    return Task.CompletedTask;
}

标签: c#async-await

解决方案


关于问题的第一部分:如果您的方法执行 I/O 调用或长时间运行的 CPU 密集型计算,并且您不希望在执行此操作时阻塞调用者线程,则返回 Task 或 Task。

您在方法中返回 void 或直接值不符合上述条件。

在第三种情况下,您声明了一个异步 void 方法,以防您的方法执行 I/O 调用或长时间运行的 CPU 计算,但您需要通过需要 void 返回类型的东西来调用它,例如在按钮单击处理程序中Winforms 或 WPF 应用程序。

另一种情况是异步执行任务但调用者期望任务或任务结果的方法。在这种情况下,您返回 Task.CompletedTask 或 Task.FromResult(value)

您的代码示例中的方法没有执行长时间的 CPU 密集型操作或 I/O 调用。无需将其定义为异步。您可以只有一个 void 返回类型,或者如果您的调用者期望一个 Task 返回类型,则将返回类型设置为 Task 并返回 Task.CompletedTask 而不使方法异步。


推荐阅读