2015-02-11 4 views
0

Я хочу передать большие файлы через протокол TCP WCF, но я не знаю, какой метод следует использовать: буферизацию или потоковых.потока или буфера больших файлов в WCF

Я хочу асинхронно передавать файлы и показывать прогресс в управлении индикатором выполнения.

Поток выглядит лучше, потому что я понятия не имею, как организовать буфер в 4 Кб и читать/писать асинхронно с методом рекурсии. Должен ли я преобразовать этот метод возвращаемого типа в Task<Stream> и назвать его?

private void test() 
{ 
    Stream _stream = new FileStream("D:\\123.avi", FileMode.Open); 
    using (FileStream fileStream = new FileStream("D:\\123\\123.avi", FileMode.Create)) 
    { 
     _stream.CopyTo(fileStream); 
    } 
} 

UPDATE Хорошо, я сделал что-то вроде этого:

public Task<Stream> GetFileStream(string path) 
     { 

      Stream _stream = new FileStream(path, FileMode.Open); 


      var taskSource = new TaskCompletionSource<Stream>(); 
      taskSource.SetResult(_stream); 
      return taskSource.Task; 
     } 
     void GetFile() 
     { 
      FileStream fileStream = new FileStream("D:\\123\\123.avi", FileMode.Create); 

      GetFileStream(@"D:\myFile.mkv").Result 
       .CopyTo(fileStream); 
     } 
private void BtnButton_Click(object sender, RoutedEventArgs e) 
     { 
      Task task = new Task(() => { GetFile(); }); 
      task.Start(); 

     } 

Что я должен сделать, чтобы связать этот процесс с ProgressBar?

+0

Насколько велики ваши файлы? –

+0

4 Гб и больше –

ответ

1

Если вы передаете действительно большие файлы, то потоковая передача - это, безусловно, путь. Буферизация станет узким местом очень быстро. Тем не менее, вы всегда должны измерять дважды и вырезать один раз, когда речь идет о производительности и масштабируемости.

Вот хорошая статья MSDN освещает тему Buffering vs Streaming in WCF:

https://msdn.microsoft.com/en-us/library/ms733742(v=vs.110).aspx

Относно отображение индикатора выполнения, оно должно быть довольно легко вычислить прогресс при чтении ломтей потока ответа от WCF оказание услуг.

Однако ваш вопрос по-прежнему слишком широк, чтобы получить более подробную информацию и конкретный код.

+0

Я обновляю свой вопрос –

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