Я бы сказал, что следующие два фрагмента кода, которые у меня есть, эквивалентны, но это не так.Метод расширения не эквивалентен прямому вызову
Ниже работает правильно:
var entry3 = Task.Run(async() => await entry2.GetMemberGroupsAsync(false)).WaitForResult().FirstOrDefault();
Следующий код, где я только переехал Task.Run.WaitForResult
цепь в метод расширения, не работает, но производит затор:
var entry3 = entry2.GetMemberGroupsAsync(false).RunSynchronouslyAndReturnResult().FirstOrDefault();
public static T RunSynchronouslyAndReturnResult<T>(this Task<T> task)
{
return Task.Run(async() => await task).WaitForResult();
}
Почему эти два фрагмента кода не эквивалентны?
Для полноты использования метод GetMemberGroupsAsync
предоставляется API-интерфейсом Microsoft Azure Graph, а функция WaitForResult определена ниже. Насколько я вижу, он не делает ничего другого в зависимости от имени вызывающего абонента или sth. как то:
public static TResult WaitForResult<TResult>(this Task<TResult> task,
bool continueOnCapturedContext = false)
{
if (task == null)
{
throw new ArgumentNullException("task");
}
try
{
return PreventForDeadLocks(task, continueOnCapturedContext).Result;
}
catch (AggregateException ex)
{
if (ex.InnerExceptions.Count == 1)
{
throw ex.InnerExceptions[0];
}
throw;
}
}
public static async Task<TResult> PreventForDeadLocks<TResult>(this Task<TResult> task,
bool continueOnCapturedContext = false)
{
return await task.ConfigureAwait(continueOnCapturedContext: continueOnCapturedContext);
}
Хуже того, 'PreventForDeadlocks' не предотвратит взаимоблокировки. ** Нет шаблона sync-over-async, который работает во всех ситуациях! ** –
Почему бы просто не сделать var var3 = (ждать entry2.GetMemberGroupsAsync (false)). FirstOrDefault(); '? Это потому, что это потребует от вас сделать метод, чтобы этот код находился внутри 'async'? Как правило, вы позволяете шаблону 'async'-'await' выходить на ваши события, а затем создавать эти« async void »(огонь и забыть). – juharr
@juharr только, что у меня нет событий - код находится внутри конечной точки WebAPI. Могу ли я сделать асинхронную конечную точку WebAPI? – Alexander