#.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.