MK-Gii Ответов: 1

Задача C# против синхронной


Эй, там!

Быстрый вопрос - Недавно я работал над старым проектом, где каждый метод имеет тип Task<t> и 95% материала синхронно. Это означает, что он всегда ждет завершения задачи, прежде чем идти дальше. Итак, есть ли какая - то польза от того, что вместо этого вы просто преобразуете метод в синхронный и удаляете ключевое слово "await"?

Ваше здоровье!

Что я уже пробовал:

Google вещи, вещи на MSDN, что

1 Ответов

Рейтинг:
9

RickZeeland

При использовании задач вы можете использовать цикл и проверить, является ли задача .IsCompleted в цикле, таким образом, вам не нужно ждать.
Задача.Свойство IsCompleted (Системы.Нарезание резьбы.Задачи) | Microsoft Docs[^]

Я использовал это в службе Windows без каких-либо асинхронных операторов и около 20 одновременных запущенных задач (включая длительные задачи) для мониторинга всех видов вещей, и это работает без каких-либо проблем.

Есть хорошая серия статей на CodeProject о задачах: Библиотека параллельных задач: 1 н[^]


MK-Gii

Но в целом - есть ли какая-то польза от использования TPL для чисто синхронных потоков?

RickZeeland

Вероятно, нет, если все задачи должны выполняться последовательно ... однако если вы используете пользовательский интерфейс, такой как winforms, может быть полезно сохранить его отзывчивым.

MK-Gii

В моем случае это был просто веб-API, где вызовы к БД, чтобы получить что-то от нее, были сделаны асинхронно, а затем каждый раз ожидали данных, прежде чем идти дальше. Таким образом, потребитель API все еще должен ждать столько же времени, и мне нужно убедиться, что я не забываю ждать каждый раз, когда я пытаюсь получить что-то из БД.

Richard Deeming

Если код на самом деле асинхронный - в данном случае это звучит так, как будто он связан с IO,-то есть преимущество.

Вместо того, чтобы вызывающий поток "зависал" до завершения операции ввода-вывода, выполняемая им работа может быть приостановлена, а поток может быть возвращен в пул и использован для обработки других задач. Когда операция завершена, можно получить свободную нить, чтобы продолжить работу.

Подумайте об этом как о разнице между тем, чтобы дети кричали на заднем сиденье машины - Мы уже почти приехали? Мы уже почти приехали?" снова и снова на протяжении всего путешествия, и чтобы они сидели тихо, глядя на свои телефоны, пока вы не скажете им, что приехали. :)

RickZeeland

Ха-ха, хорошее сравнение, теперь перейдем к запуску SpaceX !

honey the codewitch

Если вы пишете код веб-сервера, держите все синхронно! ASP.NET не предназначен для асинхронности. Жизненный цикл страницы выполняется от начала до конца, поэтому вся обработка должна выполняться последовательно, чтобы страница все равно отображалась. Все, что ты будешь делать-это все испортить. ASP.NET это эвристика пула потоков, так как она не предназначена для этого. Лучше вообще не использовать Task. Надеюсь, это поможет!