在WCF中流式传输或缓冲大文件

时间:2015-02-11 09:22:36

标签: c# .net wcf filestream

我想通过WCF tcp协议传输大文件,但我不知道应该使用哪种技术:缓冲流式传输

我想异步传输文件并在进度条控件中显示进度。

Streaming看起来更好,因为我不知道如何使用递归方法组织4 Kb中的缓冲区和读/写异步。 我应该将此方法的返回类型转换为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);
    }
}

更新 好的,我做过类似的事情:

    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?

1 个答案:

答案 0 :(得分:1)

如果您要传输非常大的文件,那么流媒体绝对是您要走的路。缓冲将很快成为瓶颈。但是,在处理性能和可伸缩性时,应始终测量两次并剪切一次。

这是一篇很好的MSDN文章,内容涉及Buffering vs Streaming in WCF

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

关于显示进度条,从WCF服务读取响应流的块时,应该很容易计算进度。

但是,您的问题仍然过于宽泛,无法通过更详细和具体的代码得到解答。