Leyendo un archivo con FileStream y FILE_FLAG_NO_BUFFERING

Un poco de historia: he estado experimentando con el uso del indicador FILE_FLAG_NO_BUFFERING cuando hago IO con archivos grandes. Estamos tratando de reducir la carga en el administrador de caché con la esperanza de que con IO de fondo, reduzcamos el impacto de nuestra aplicación en las máquinas de los usuarios. El rendimiento no es un problema. Estar detrás de escena tanto como sea posible es un gran problema. Tengo una envoltura cercana al trabajo para hacer IO sin almacenamiento de memoria, pero me encontré con un problema extraño. Recibo este error cuando llamo a Leer con un desplazamiento que no es un múltiplo de 4.

El identificador no admite operaciones síncronas. Es posible que los parámetros del constructor FileStream deban cambiarse para indicar que el identificador se abrió de forma asíncrona (es decir, se abrió explícitamente para la E / S superpuesta).

¿Por qué pasó esto? ¿Y no se contradice este mensaje? Si agrego la opción de archivo asíncrono, obtengo una excepción IOException (el parámetro es incorrecto).

Supongo que la verdadera pregunta es ¿qué hacen estos requisitos,http://msdn.microsoft.com/en-us/library/windows/desktop/cc644950%28v=vs.85%29.aspx, tienen que ver con estos múltiplos de 4.

Aquí está el código que demuestra el problema:

FileOptions FileFlagNoBuffering = (FileOptions)0x20000000;
int MinSectorSize = 512;
byte[] buffer = new byte[MinSectorSize * 2];
int i = 0;
while (i < MinSectorSize)
{
    try
    {
        using (FileStream fs = new FileStream(@"<some file>", FileMode.Open, FileAccess.Read, FileShare.None, 8, FileFlagNoBuffering | FileOptions.Asynchronous))
        {
            fs.Read(buffer, i, MinSectorSize);
            Console.WriteLine(i);
        }
    }
    catch { }
    i++;
}
Console.ReadLine();

Respuestas a la pregunta(2)

Su respuesta a la pregunta