c#progressbar根据文件发送进度更新

时间:2015-07-20 19:31:57

标签: c# sockets progress-bar

我在套接字上发送一个转换为byte的文件。我想更新当前的发送状态(使用weboscket并从网上下载somthing时类似的东西)。

这是发送代码:

byte[] arr = File.ReadAllBytes(file); //sending simple text file.
 s.Send(data); //s is a socket of course.

现在我当然不能这样做

s.Send(data);
 progressBar1.Value=100;//show completed progress after sucesufully send.

但我希望在发送文件时这样做..并根据fil状态更新它...让我们说如果它的100kb文件所以每1kb发送更新它..我知道即时发送整个文件而不是它的一部分,但仍然......有什么办法吗?

1 个答案:

答案 0 :(得分:1)

Socket.Send阻止,直到发送byte[]中的所有数据为止。因此,除非您在发送全部数据之前多次发送小块数据,否则您将无法更新进度条。

如果您需要可靠的通信,则需要使用TCP / IP。 TCP / IP的默认最大数据包大小约为1500字节(“MTU”)。确切的值取决于计算机的网络设置。如果你拆分你的数据,我建议你把它做成多个MTU大小,这样你就没有半包了 但是,如果你真的通过网络进行传输,我想知道为什么你要实现一个进度条,通过一个能够传输100Mbit / s甚至1000MBit / s的网络发送100kB ...你的数据将在之前发送用户界面甚至有机会更新进度条。这仅对>>的中型或大型数据感兴趣。 1MB。

增强:
有关详细信息,请参阅MSDN Socket.Send。请特别阅读该页面上的说明:

  

成功完成发送并不表示数据已成功发送。

因为这意味着数据只能成功存储在输​​出缓冲区中。如果你真的想知道数据已经到达,你应该设计你的对手在每个(n)数据包之后发送回复。