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