gpt4 book ai didi

c# - 异步 lambda : "a task was cancelled"

转载 作者:行者123 更新时间:2023-11-30 23:20:54 24 4
gpt4 key购买 nike

工作流程如下:

  1. 传入 HTTP 请求到 WebApi2 端点。
  2. 进行同步(例如非异步)调用以获取一些数据。
  3. 将数据库实体的响应映射到 API 模型。A。执行 AutoMapper 映射。b.包括以下片段(见下文)。C。如果操作“快速”,则没有问题。如果操作“缓慢”,则抛出“任务已取消”异常。

在映射 Action 很快的情况下,我很幸运。但是如果我添加一个 Task.Delay(2000),那么我会得到有问题的异常。似乎 ASP.NET 没有“等待”我的异步兰巴完成?

这是映射表达式的主体:

mapping.AfterMap(async (entity, model) => {
var child = await _childRepo.Get(entity.ChildId);
await Task.Delay(2000); // For testing, of course.
if (child != null)
{
// Fill in some properties on model
}
});

请注意,这是示例代码,我不打算在“现实生活”中映射期间进行额外的 DB/repo 调用。

最佳答案

AfterMap takes an Action ,这是一个 synchronous delegate, not an asynchronous delegate (正如我在我的博客上解释的那样)。因此,它不能像预期的那样与 async lambda 一起工作。

在这种情况下(因为委托(delegate)返回 void),编译器实际上将允许 async lambda;但是,它将编译为 async void 方法。 (编译器这样做是为了允许 async 事件处理程序)。正如我在有关异步最佳实践的 MSDN 文章中所述,您应该 avoid async void .

避免 async void 的原因之一是很难检测到 async void 方法何时完成。事实上,(WebForm 生命周期事件除外)ASP.NET 甚至不会尝试这样做。

关于c# - 异步 lambda : "a task was cancelled",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39551100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com