我想通过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?
答案 0 :(得分:1)
如果您要传输非常大的文件,那么流媒体绝对是您要走的路。缓冲将很快成为瓶颈。但是,在处理性能和可伸缩性时,应始终测量两次并剪切一次。
这是一篇很好的MSDN文章,内容涉及Buffering vs Streaming in WCF
:
https://msdn.microsoft.com/en-us/library/ms733742(v=vs.110).aspx
关于显示进度条,从WCF服务读取响应流的块时,应该很容易计算进度。
但是,您的问题仍然过于宽泛,无法通过更详细和具体的代码得到解答。