WCF中使用Stream来传送文件,应该如何通知进度?

种草德鲁伊 2011-02-07 02:25:07
用的是netTcpBinding

现在的做法是在客户端用一个单独的线程来读取Stream的Position。

能不能用回调方法来实现呢?
...全文
173 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
种草德鲁伊 2011-02-07
  • 打赏
  • 举报
回复
多谢指点了,看来还是应该像原来的一样分块来传..
  • 打赏
  • 举报
回复
退一步说,至少它应该是支持断点续传的。

如果你按照这个产品级的要求来设计操作流程,那么知道传递进度就是举手之劳,因为数据结构就是如此。
  • 打赏
  • 举报
回复
分块传送才是设计师所设计的产品级的上传功能。

这个技术比如要求:客户端会以10个线程同时上传,可以断点续传。
种草德鲁伊 2011-02-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]

http://kb.cnblogs.com/a/1607823/
[/Quote]

链接里那种方式显示进度条已经会了,现在是用Stream来传递的。


namespace FileTransfer.Service
{
[MessageContract]
public class FileStreamWrapper
{
[MessageHeader]
public string FileName { get; set; }

[MessageBodyMember]
public Stream Data { get; set; }
}

[ServiceContract]
public interface IFileService
{
[OperationContract]
void Store(FileStreamWrapper file);
}

public class FileService : IFileService
{
private static DirectoryInfo dir;
public static DirectoryInfo FileDirectory
{
get
{
if (dir == null)
{
dir = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Files"));
if (!dir.Exists) { dir.Create(); }
}
return dir;
}
}

public void Store(FileStreamWrapper file)
{
string path = Path.Combine(FileDirectory.FullName, file.FileName);
FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None);
var src = file.Data;
var buffer = new byte[4096];
int bytesRead = 0;

while ((bytesRead = src.Read(buffer, 0, buffer.Length)) > 0)
{
fs.Write(buffer, 0, bytesRead);
Console.WriteLine("WriteData: {0} - {1} - {2}", file.FileName, bytesRead, DateTime.Now);
}
fs.Close();
}
}
}

wuyq11 2011-02-07
  • 打赏
  • 举报
回复

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧