Работает режим отладки, сбой выпуска - PullRequest
0 голосов
/ 07 июля 2019

Я пытаюсь запустить приложение asp.net в производство.Но когда я запускаю приложение в Production, определенный маршрут работает не так хорошо.Там написано, что 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);
}

Автор должен быть нулевым, это должен быть объект с атрибутами.

Редактировать: я пытался использовать [MethodImpl(MethodImplOptions.NoOptimization)]на этом роутере.Это тоже не сработало.

1 Ответ

2 голосов
/ 07 июля 2019

Проблема в том, что лямбда, которую вы используете в ForEach, - это в основном метод 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...