Безопасен ли поток асинхронного ввода-вывода файла?

#.net #file-io #asynchronous #filestream

#.net #file-io #асинхронный #filestream

Вопрос:

Является ли асинхронный ввод-вывод файла подобным FileStream.Безопасен ли поток BeginWrite? Если нет, то его нужно обернуть с помощью «SyncLock», это означает, что он все еще блокирует поток.

Комментарии:

1. Можете ли вы привести пример, который заставляет вас думать, что это не потокобезопасно?

Ответ №1:

FileStream.BeginWrite уже запускается новый поток для доступа к файлам. Вам не нужно запускать FileStream.BeginWrite в отдельном потоке (потому что это будет поток в потоке). С другой стороны, несколько FileStream.BeginWrite функций не должны обращаться к одному и тому же файлу одновременно.

Ответ №2:

Кроме того, если к ресурсу обращаются несколько потоков, это означает, что это общий ресурс, и существует множество ресурсов для их использования в c #.

Ответ №3:

FileStream.Реализации BeginRead / BeginWrite асинхронны, но их использование перекрывающегося ввода-вывода не выполняется потокобезопасным способом.

Вы можете видеть, что BeginRead / BeginWrite не принимают позицию файла для чтения / записи в качестве параметра, поэтому операции в других потоках (например, Seek) могут привести к тому, что чтение / запись будут выполняться в неправильной позиции файла.

Если вы все еще не уверены, в реализации FileStream от Microsoft явно укажите «Это не потокобезопасно». в комментарии внутри BeginReadCore и BeginWriteCore.

Итог: если вам нужен потокобезопасный ввод-вывод с перекрытием, вам придется использовать P / Invoke с ReadFile / WriteFile.