c# - 任务和返回类型
问题描述
我有一个关于任务的问题。我知道我们应该选择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;
}
解决方案
关于问题的第一部分:如果您的方法执行 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 而不使方法异步。
推荐阅读
- sql - 无法解决需要子查询的问题
- powershell - 在不修改 Fiddler 规则的情况下转储 fiddler 上的会话
- python - “x”在“for x in range(10):”中是什么意思?
- python - 将 python 包转换为单个可导入文件
- openstreetmap - 匹配服务响应中节点 ID 的纬度/经度
- python-3.x - 指数曲线拟合 Python
- javascript - 简化两个 jQuery 函数以更改两个单独下拉列表的背景
- python - 按索引将列表分配给系列
- python - Pygame 碰撞导致球赛出现问题
- android - 如何使用此布局创建 gridView 2 列