2015-05-06 4 views
3

У меня есть метод ФОС, как это для загрузки файлов ломтей:FileStream не закрывается, даже если это в заявлении, используя

public void UploadChunk (RemoteFileChunk file) 
{ 
    using (var targetStream = new FileStream("some-path", FileMode.OpenOrCreate, FileAccess.Append, FileShare.None)) 
    { 
     file.Stream.CopyTo(targetStream); 
     file.Stream.Close(); 
    } 
} 

который является довольно основным материалом. Но то, что происходит в исключительном случае, довольно странно. Исключительный случай шаги:

  1. Начало загрузив кусок
  2. Сыпучие подключение к Интернету во время загрузки
  3. методы UploadChunk бросает CommunicationException из-за потери соединения Интернет
  4. ... ждать подключения к Интернету, чтобы вернуться
  5. Начало загрузки последнего фрагмента
  6. Boom !!! Выдает исключение ниже:

Процесс не может получить доступ к файлу «некоторые альтернативные пути», так как он используется другим процессом.

Я знаю, что файл не тронут кем-либо еще, что приводит меня к тому, что файл остался открытым при последнем вызове, когда соединение потеряно. Но, насколько я знаю, using заявление должно было закрыть FileStream, однако в этом случае это не так.

Что мне может не хватать здесь?

Btw, у меня есть еще question, который, как я предполагаю, вызван той же проблемой, о которой я не знаю. Может быть, это может привести вас, ребята, к какой-то подсказке.

+0

потому что ваша оригинальная потоковая операция не выполнена. –

+0

Выполнено ли первоначальное выполнение 'UploadChunk' при повторном попытке? Таймауты сети могут быть длиннее, чем вы ожидаете. – Richard

+0

Предполагаю, что вы столкнулись с исключением. В этом случае вы должны окружить свой код в блоке try-catch-finally и закрыть поток, что бы ни случилось неожиданно. – greenhoorn

ответ

1

Что такое RemoteFileChunk? Я предполагаю, что это RemoteFileChunk, у которого файл открыт. Вы не указали какой-либо код для RemoteFileChunk, который демонстрирует, что он автоматически закрывает свой поток при возникновении исключения. Это должно сработать (хотя было бы лучше инкапсулировать закрытие в пределах самого RemoteFileChunk):

public void UploadChunk (RemoteFileChunk file) 
{ 
    using (var targetStream = new FileStream("some-path", FileMode.OpenOrCreate, FileAccess.Append, FileShare.None)) 
    { 
     try 
     { 
      file.Stream.CopyTo(targetStream); 
     } 
     finally 
     { 
      file.Stream.Close(); 
     } 
    } 
} 
+1

Путь, который дает исключения, это «некоторый путь», что он имеет отношение к 'file.Stream'? –