c#进度条根据文件发送进度更新
c# progressbar update according to file send progress
我在套接字上发送一个转换为字节的文件。我想更新当前的发送状态(使用 weboscket 和从网上下载东西时类似的东西)。
这是发送代码:
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.
但我想在发送文件时执行此操作..并根据文件状态更新它...假设它的 100kb 文件所以每发送 1kb 更新它..我知道我正在发送整个文件一次而不是它的一部分,但仍然......有什么办法吗?
Socket.Send
一直阻塞,直到 byte[]
中的所有数据都发送完毕。因此,除非您多次发送小块数据,直到传输全部数据,否则您将没有任何机会更新进度条。
如果你想要可靠的通信,你需要使用TCP/IP。 TCP/IP 的默认最大数据包大小约为 1500 字节 ('MTU')。确切的值取决于您计算机的网络设置。如果你拆分你的数据,我建议你将它分成 MTU 大小的倍数,这样你就不会有半个数据包。
但是如果你真的通过网络传输,我想知道你为什么要在能够传输 100Mbit/s 甚至 1000MBit/s 的网络上实现一个发送 100kB 的进度条......你的数据将在之前发送UI 甚至有机会更新进度条。这仅对 >> 1MB 的中型或大型数据有意义。
增强:
有关详细信息,请参阅 MSDN Socket.Send。请特别阅读该页面上的注释:
The successful completion of a send does not indicate that the data was successfully delivered.
因为这意味着数据仅成功存储在输出缓冲区中。如果你真的想知道数据已经到达,你应该设计你的对手在每(n)个数据包之后发送一个回复。
我在套接字上发送一个转换为字节的文件。我想更新当前的发送状态(使用 weboscket 和从网上下载东西时类似的东西)。
这是发送代码:
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.
但我想在发送文件时执行此操作..并根据文件状态更新它...假设它的 100kb 文件所以每发送 1kb 更新它..我知道我正在发送整个文件一次而不是它的一部分,但仍然......有什么办法吗?
Socket.Send
一直阻塞,直到 byte[]
中的所有数据都发送完毕。因此,除非您多次发送小块数据,直到传输全部数据,否则您将没有任何机会更新进度条。
如果你想要可靠的通信,你需要使用TCP/IP。 TCP/IP 的默认最大数据包大小约为 1500 字节 ('MTU')。确切的值取决于您计算机的网络设置。如果你拆分你的数据,我建议你将它分成 MTU 大小的倍数,这样你就不会有半个数据包。
但是如果你真的通过网络传输,我想知道你为什么要在能够传输 100Mbit/s 甚至 1000MBit/s 的网络上实现一个发送 100kB 的进度条......你的数据将在之前发送UI 甚至有机会更新进度条。这仅对 >> 1MB 的中型或大型数据有意义。
增强:
有关详细信息,请参阅 MSDN Socket.Send。请特别阅读该页面上的注释:
The successful completion of a send does not indicate that the data was successfully delivered.
因为这意味着数据仅成功存储在输出缓冲区中。如果你真的想知道数据已经到达,你应该设计你的对手在每(n)个数据包之后发送一个回复。