Обертывание медленного синхронного ввода-вывода для асинхронного потребления пользовательского интерфейса - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть внешняя библиотека, которая выполняет медленный ввод / вывод (последовательный + беспроводной и т. Д.), Без асинхронного (даже старого стиля) в API.

Я пытаюсь работатьспособ обернуть это для легкого потребления из пользовательского интерфейса, чтобы мой пользователь мог подключиться без полной блокировки интерфейса, и желательно, чтобы я мог просто async-await.

Но я читаю противоречивые советы, такие какmsgstr "использовать Task.Run только для операций с процессором".

Итак, что мне делать?Просто async-await a Task.Run (без учета ConfigurAwait(false)) или реализуйте целое INotifyCompletion?

1 Ответ

0 голосов
/ 08 февраля 2019

Важно отличать от «идеального» и «реального мира».В идеале, async должно быть полностью.В идеале все операции ввода-вывода должны быть асинхронными и не использовать потоки пула потоков, а Task.Run используется только для методов, связанных с процессором.В идеале async void следует использовать только для обработчиков событий.

В реальном мире иногда приходится смешивать async и синхронизировать из-за нехватки времени (или поддержки библиотеки).В реальном мире не все операции ввода-вывода имеют асинхронные API-интерфейсы, и даже блестящие новые типы, такие как HttpClient, используют потоки пула потоков для работы со старым кодом разрешения DNS, который никто не хочет тратить на исправление.В реальном мире async void иногда является более чистым подходом, чем простые продолжения, даже если он не используется для обработчиков событий.

В вашем случае я бы просто использовал Task.Run и не беспокоился об этом.Основные проблемы с Task.Run связаны с тем, что вы используете его в приложении ASP.NET или в библиотеке, где это может помешать другому использованию пула потоков.Поскольку вы работаете с приложением пользовательского интерфейса, использование Task.Run для ввода-вывода не является «идеальным», но это идеальный вариант в качестве компромисса.

...