Правильный способ вернуть асинхронную задачу в неасинхронный метод

Какова лучшая практика при возврате следующей задачи:

public async Task<Command> BuildCommunicationCommand

Как объект:

public Command BuildCommand

У меня есть следующее:

 public Command BuildCommand()
    {
        return BuildCommunicationCommand().GetAwaiter().GetResult();
    }

Но было сказано, чтобы попытаться избежать этого и что я должен ждать Задачи, чтобы мы не блокировали поток пользовательского интерфейса. Я думаю, что лучший способ сделать это - сделать метод BuildCommand асинхронным и все, что его вызывает. Это было бы серьезным изменением и на самом деле не требуется для других классов, которые используют BuildCommand. Я не хочу вызывать блок с помощью.Result, поэтому прочитал все возможное, чтобы использовать ConfigureAwait(false) в этом случае:

 public Command BuildCommand()
        {
            var Command = BuildCommunicationCommand().ConfigureAwait(false);

            return Command.GetAwaiter().GetResult();
        }

Могу ли я использовать ConfigureAwait(false), чтобы дождаться завершения процесса, а затем вызвать.GetAwaiter().GetResult(), чтобы вернуть его в качестве объекта Command?

Я впервые работаю с асинхронными задачами, поэтому, если что-то из вышеперечисленного является полным мусором, извините!

1 ответ

Решение

Вы можете заключить вызов вашего асинхронного метода в другой метод, который ожидает завершения задачи, а затем возвращает результат. Конечно, это блокирует поток, который вызывает GetData. Но это избавляет от асинхронного "вируса". Что-то вроде этого:

 private string GetData()
 {
     var task = GetDataAsync();
     task.Wait();
     return task.Result;
 }
 private async Task<string> GetDataAsync()
 {
     return "Hello";
 }

Тем не менее, вы спрашиваете о передовых практиках, и это означает, что при необходимости все должно быть асинхронным.

Другие вопросы по тегам