Выполнение асинхронных операций - PullRequest
0 голосов
/ 23 февраля 2009

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

Были ли проведены какие-либо контрольные тесты для сравнения выполнения синхронной и асинхронной операций (файл, сеть и т. Д.)? Действительно ли имеет смысл выполнять асинхронную операцию вместо охвата отдельного потока и выполнять синхронную операцию в серверной среде, если асинхронная операция в разы медленнее, чем синхронная?

Ответы [ 3 ]

2 голосов
/ 23 февраля 2009

Цитата из статьи, которую вы включили в свой комментарий к ответу @ Alex.

В ситуациях, когда запрос ввода-вывода Ожидается, что потребуется большое количество время, такое как обновление или резервное копирование большая база данных или медленный канал связи, асинхронный ввод / вывод как правило, это хороший способ оптимизировать эффективность обработки. Однако для относительно быстрые операции ввода-вывода, накладные расходы на обработку ввода / вывода ядра запросы и сигналы ядра могут сделать асинхронный ввод / вывод менее выгоден, особенно если много быстрого ввода / вывода операции должны быть сделаны. В этом В этом случае синхронный ввод-вывод был бы лучше. Механизмы и реализация детали того, как выполнить эти задачи варьируются в зависимости от типа дескриптор устройства, которое используется и особые потребности приложения. Другими словами, обычно есть несколько способов решения проблемы.

FWIW, я думаю, что @Alex правильно, что есть другой поток, выполняющий код ядра, связанный с вашим запросом ввода-вывода. Тем не менее, этот поток не управляется вашим приложением. Поток, выполняющий код ядра, может сам заблокировать запрос ввода-вывода устройства и подождать, пока фактическое оборудование завершит запрос, прежде чем сигнализировать потоку пользовательского режима, но тем не менее он все еще там.

Использование асинхронных потоков не следует рассматривать как способ увеличения скорости любого конкретного запроса, а скорее как способ повысить общую эффективность, позволяя вашему приложению продолжать обработку других задач, ожидая относительно медленного ввода-вывода .

1 голос
/ 23 февраля 2009

На самом деле условия, при которых файловый ввод / вывод будет на самом деле быть асинхронным, довольно специфичны, даже на родном уровне Win32. Подробнее см. в этой статье .

1 голос
/ 23 февраля 2009

Вы уверены, что правильно протестировали свою операцию копирования? Любая асинхронная операция просто создает новый поток и запускает операцию в новом потоке, оставляя основной поток для других действий.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...