Я занимаюсь обновлением библиотеки, интерфейс API которой был встроен в .NET 3.5. В результате все методы синхронны. Я не могу изменить API (т. е. преобразовать возвращаемые значения в Task), потому что для этого потребуется изменение всех вызывающих объектов. Итак, мне осталось узнать, как лучше всего вызывать асинхронные методы синхронно. Это относится к консольным приложениям ASP.NET 4, ASP.NET Core и .NET/.NET Core.
Возможно, я недостаточно ясно выразился — Ситуация такова, что у меня есть код, не поддерживающий асинхронность, и я хочу использовать новые библиотеки, такие как System.Net.Http и AWS SDK, которые поддерживают только асинхронные методы. Поэтому мне нужно устранить этот пробел и иметь возможность иметь код, который можно вызывать синхронно, но затем вызывать асинхронные методы в другом месте.
Я много читал , и об этом неоднократно спрашивали и давали ответы.
Вызов асинхронного метода из неасинхронного метода
Синхронное ожидание асинхронной операции и почему Wait() здесь останавливает программу
Вызов асинхронного метода из синхронного метода
Как синхронно запустить асинхронный метод Task?
Синхронный вызов асинхронного метода
Как вызвать асинхронный метод из синхронного метода в C#?
Проблема в том, что большинство ответов разные! Самый распространенный подход, который я видел, — это использование .Result, но это может привести к тупику. Я пробовал все следующее, и они работают, но я не уверен, какой подход является лучшим, чтобы избежать взаимоблокировок, добиться хорошей производительности и хорошо сочетаться со средой выполнения (с точки зрения соблюдения планировщиков задач, параметров создания задач и т. д.). ). Есть ли однозначный ответ? Какой подход лучше всего?
private static T taskSyncRunner(Func task)
{
T result;
// approach 1
result = Task.Run(async () => await task()).ConfigureAwait(false).GetAwaiter().GetResult();
// approach 2
result = Task.Run(task).ConfigureAwait(false).GetAwaiter().GetResult();
// approach 3
result = task().ConfigureAwait(false).GetAwaiter().GetResult();
// approach 4
result = Task.Run(task).Result;
// approach 5
result = Task.Run(task).GetAwaiter().GetResult();
// approach 6
var t = task();
t.RunSynchronously();
result = t.Result;
// approach 7
var t1 = task();
Task.WaitAll(t1);
result = t1.Result;
// approach 8?
return result;
}
Подробнее здесь: https://stackoverflow.com/questions/403 ... async-code