我正在尝试将我的asp.net应用程序投入生产。但是,当我在生产环境中运行该应用程序时,某条路线无法很好地工作。它说post.Author == null。当我在调试中运行该应用程序时,即使没有断点,它也可以很好地运行。
我在发布版本中尝试了该应用程序,或者仅使用了骑手中的“开始”按钮,两者均无效。
那是我要调试的路由。我也有其他一些路线的问题。
[HttpGet("public/{orgId}")]
public async Task<ActionResult<List<PostModel>>> GetAllPublicPostsByOrgId(string orgId)
{
List<PostModel> posts = await _postRepository.GetAllPostsByOrgId(orgId);
posts.ForEach(async post =>
{
UserModel author = await _userRepository.GetUserById(post.AuthorId);
UserModel saveAuthor = new UserModel();
saveAuthor.FirstName = author.FirstName;
saveAuthor.LastName = author.LastName;
post.Author = saveAuthor;
});
return Ok(from post in posts where post.Published select post);
}
作者应该为null,它应该是具有属性的对象。
编辑:我尝试在该路由器上使用[MethodImpl(MethodImplOptions.NoOptimization)]
。那也没有用。
答案 0 :(得分:2)
问题在于,您在ForEach
中使用的lambda基本上是一种async void
方法,这意味着它会被抛弃。因此,您的代码将在完成所有return
属性的设置之前进入Author
。相反,您应该使用普通的foreach(var post in posts)
,以便该方法将等待所有Author
属性的设置。请注意,这可能仅在发行时失败的原因是,这是一种竞争条件,调试可能会使东西变慢,足以使其不发生。
或者,您可以将代码制成方法,然后并行执行,然后等待所有任务完成后再返回。
[HttpGet("public/{orgId}")]
public async Task<ActionResult<List<PostModel>>> GetAllPublicPostsByOrgId(string orgId)
{
List<PostModel> posts = await _postRepository.GetAllPostsByOrgId(orgId);
var authorSetTasks = new List<Task>();
foreach(var post in posts)
{
authorSetTasks.Add(SetAuthor(post));
}
await Task.WhenAll(authorSetTasks);
return Ok(from post in posts where post.Published select post);
}
private async Task SetAuthor(PostModel post)
{
UserModel author = await _userRepository.GetUserById(post.AuthorId);
UserModel saveAuthor = new UserModel();
saveAuthor.FirstName = author.FirstName;
saveAuthor.LastName = author.LastName;
post.Author = saveAuthor;
}