Недавно я решил проблему, возникшую при попытке выполнить асинхронный метод. Для меня это поставило больше вопросов, чем решило. Короче говоря, я счастлив, что это работает, но я не знаю, почему это работает.
Я пытался запустить следующий метод клиентской библиотеки Microsoft Graph:
_graphServiceClient.Users[userPrincipalName].Request().GetAsync()
Следующий подход не сработал, так как зависает после использования await
:
async Task<User> GetUser(string userPrincipalName)
{
User user = await _graphServiceClient.Users[userPrincipalName].Request().GetAsync();
return user;
}
Следующий подход также не работает, так как он зависает после выполнения runTask.Wait()
:
User GetUser(string userPrincipalName)
{
return (User) GetResult(_graphServiceClient.Users[userPrincipalName].Request().GetAsync());
}
object GetResult<TResult>(Task<TResult> task)
{
using (task)
using (var runTask = Task.Run(async () => await task))
{
try
{
runTask.Wait();
return runTask.Result;
}
catch (AggregateException e)
{
throw e.InnerException ?? e;
}
}
}
Здесь все становится странно, так как следующий код работал:
User GetUser(string userPrincipalName)
{
using (var task = Task.Run(async () => await _graphServiceClient.Users[userPrincipalName].Request().GetAsync()))
{
try
{
task.Wait();
return task.Result;
}
catch (AggregateException e)
{
throw e.InnerException ?? e;
}
}
}
Хотя я понимаю, что последние два подхода не считаются наилучшей практикой, я полностью озадачен тем, почему третий подход работает, а второй - нет. Мне кажется, они почти идентичны.
Так почему третий метод работает, а не второй?