StreamWriter.Write блокирует текущий поток? - PullRequest
0 голосов
/ 03 января 2019

Я только что заметил, что код регистрации в нашем приложении использует

streamWriter.Write(message);

вместо

await streamWriter.WriteAsync(message);

Но будет ли .Write фактически блокировать текущий поток, как обычная асинхронная операция? В массово параллельной системе я бы увидел выигрыш в производительности при переходе на WriteAsync?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Будет ли StreamWriter блокироваться, зависит от того, в какой поток он записывает свои данные.Если вы посмотрите на исходный код StreamWriter , вы увидите, что запись только добавит данные в свой внутренний буфер и сбросит их в поток, когда этот буфер заполнен.

Потокскопирует данные в свой внутренний буфер, а когда он заполнится, он будет сброшен.Сброс выполнит фактическое сохранение.

Если Stream является MemoryStream, тогда Flush не будет стоить дорого, но если он записывает в файл, это может занять некоторое время.

В общем, вы видите все задействованные буферы.Разработчики концепции Stream и StreamWriter уже думали об улучшении времени отклика до того, как было изобретено async-await.

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

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

0 голосов
/ 03 января 2019

Да, лучше перейти на WrtieAsync, потому что метод WriteAsync позволяет выполнять ресурсоемкие операции ввода-вывода, не блокируя основной поток.

Это соображение производительности особенно важно в приложении Windows 8.x Store или настольном приложении, где длительная потоковая операция может заблокировать поток пользовательского интерфейса и заставить ваше приложение выглядеть так, как будто оно не работает. Методы async используются вместе с ключевыми словами async и await в Visual Basic и C #.

https://docs.microsoft.com/en-us/dotnet/api/system.io.stream.writeasync?view=netframework-4.7.2

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