Для желающих еще глубже разобраться в теме работы с файлами, могу посоветовать вот этот доклад с дотнекста от Adam Sitnik одного из разработчиков дотнета. Из неочевидного: в Linux, даже если указан флаг useAsync, все равно используется синхронный IO, а само ожидание просто выполняется на тредпуле. Issue на эту тему все еще открыта.