Я занимаюсь обновлением библиотеки, интерфейс 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
Вызов асинхронных методов из неасинхронного кода ⇐ C#
Место общения программистов C#
-
Anonymous
1727213535
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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/40324300/calling-async-methods-from-non-async-code[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия