作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
工作流程如下:
在映射 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/
我是一名优秀的程序员,十分优秀!