Вызов асинхронных методов из неасинхронного кодаC#

Место общения программистов C#
Ответить
Anonymous
 Вызов асинхронных методов из неасинхронного кода

Сообщение Anonymous »

Я занимаюсь обновлением библиотеки, интерфейс 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»