2015-02-26 2 views
-2

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

try 
{ 
    using (var sourceStream = new FileStream(pathToDownloadedMedia, FileMode.Open, FileAccess.Read, FileShare.None, bufferSize: 4096, useAsync: true)) 
    { 
     using (var destinationStream = File.Create(pathToProcessedMedia)) 
     { 
      await sourceStream.CopyToAsync(destinationStream); 
     } 
    } 
} 
catch (Exception) 
{ 
    throw new ApplicationException(); 
} 

Я пробовал аллювиальный, как показано ниже, но без успеха. Такая же ошибка преобладает.

using (var sourceStream = await Task.Factory.StartNew(() => File.Open(pathToDownloadedMedia, FileMode.Open, FileAccess.Read, FileShare.None))) 
        { 
         using (var destinationStream = File.Create(pathToProcessedMedia)) 
         { 
          await sourceStream.CopyToAsync(destinationStream); 
         } 
        } 
+1

* «Выполнение открытия файла асинхронно» * Ручка открывается синхронно. Почему вы думаете, что открытие асинхронно приведет к ошибке? –

+0

@Sharique Выход из использования удаляет файл –

+0

Вы открываете FileStream с FileShare.None. Вы пробовали это с помощью FileShare.Read? –

ответ

1

Нет; разные потоки, пытающиеся открыть файл в одно и то же время, будут мешать друг другу. Вы можете заблокировать общий объект, чтобы заставить потоки запускать один за раз.

Или просто используйте встроенную функцию трассировки .NET; вы можете настроить файл app.config для записи в файл.

-1

Я нашел решение. Просто переход на Fileshare.ReadWrite решить проблему

using (var sourceStream = await Task.Factory.StartNew(() => File.Open(pathToDownloadedMedia, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) 
        { 
         using (var destinationStream = File.Create(pathToProcessedMedia)) 
         { 
          await sourceStream.CopyToAsync(destinationStream); 
         } 
        } 

Я изменил решение, убирая создаваемой задачи. Теперь он работает хорошо.

using (var sourceStream = File.Open(pathToDownloadedMedia, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
        { 
         using (var destinationStream = File.Create(pathToProcessedMedia)) 
         { 
          await sourceStream.CopyToAsync(destinationStream); 
         } 
        } 
+3

Это неправильное использование Заданий, просто перенос синхронного кода ввода-вывода в Задачу - это отходы. – JohnD

Смежные вопросы