在 WCF 中流式传输或缓冲大文件
Stream or buffer big files in WCF
我想通过 WCF tcp 协议传输大文件,但我不知道应该使用哪种技术:buffering 或 streaming.
我想异步传输文件并在进度条控件中显示进度。
流式处理看起来更好,因为我不知道如何组织 4 Kb 的缓冲区和 read/write 异步递归方法。
我应该将此方法 return 类型转换为 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?
如果您要传输非常大的文件,那么流式传输绝对是您的不二之选。缓冲将很快成为瓶颈。但是,无论何时处理性能和可伸缩性,您都应该始终测量两次并削减一次。
这是一篇不错的 MSDN 文章,涵盖了 Buffering vs Streaming in WCF
的主题:
https://msdn.microsoft.com/en-us/library/ms733742(v=vs.110).aspx
关于显示进度条,从 WCF 服务读取响应流块时计算进度应该很容易。
但是,您的问题仍然太宽泛,无法用更详细和具体的代码来回答。
我想通过 WCF tcp 协议传输大文件,但我不知道应该使用哪种技术:buffering 或 streaming.
我想异步传输文件并在进度条控件中显示进度。
流式处理看起来更好,因为我不知道如何组织 4 Kb 的缓冲区和 read/write 异步递归方法。
我应该将此方法 return 类型转换为 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?
如果您要传输非常大的文件,那么流式传输绝对是您的不二之选。缓冲将很快成为瓶颈。但是,无论何时处理性能和可伸缩性,您都应该始终测量两次并削减一次。
这是一篇不错的 MSDN 文章,涵盖了 Buffering vs Streaming in WCF
的主题:
https://msdn.microsoft.com/en-us/library/ms733742(v=vs.110).aspx
关于显示进度条,从 WCF 服务读取响应流块时计算进度应该很容易。
但是,您的问题仍然太宽泛,无法用更详细和具体的代码来回答。