如何等待流写入完成

时间:2011-08-31 15:16:49

标签: c# networking networkstream

我有一个服务器应用程序,用于侦听端口8888上的连接。我也在创建客户端应用程序。这是一个简单的应用程序,唯一困难的是管理多个连接。所以我只需要在计算机之间发送文件,所以我这样做的方式,我不知道它是否是怀特,但它的工作原理也许你们可以纠正我。这是发送文件时的算法:

NetworkStream stream = \\ initialize it

while(someCondition)
{
  // first I open the file for reading and read chunks of it
  byte[] chunk = fileRead(file, indexStart, indexEnd) // I have a similar method this is just to illustate my point

  stream.Write(chunk, \\other params)

   // since I often send large files it will be nice if I can wait here 
   // until the stream.Write is done. when debuging this the while loop 
   // executes several times then it waits. 

}

另一方面,我从该流中读取字节并将其写入文件。

我还需要等待,因为我发送了多个文件,我想确保在移动到下一个文件之前已经发送了第一个文件。我知道我可以通过在传输完成后使用stream.Read方法来解决这个问题。并从客户端发回数据。但有时我相信知道stream.write何时完成会有所帮助。


修改

好的,基于你的答案我可以例如向我的客户端发送我要发送的字节数。一旦客户端收到那么多字节,就意味着它完成了。但我的问题是这是否有效。我的意思是做像

这样的事情

在服务器上:

写入数据“发送文件长度”

读取数据“检查客户端是否收到了长度”(例如,期待字符串确定)

写入数据“tel the client the name of the file”

读取数据“检查客户端是否收到了文件名”

写入数据“开始发送文件的块”

读取数据“等到客户端回复字符串确定例如”

2 个答案:

答案 0 :(得分:5)

时写入完成
stream.Write(chunk, \\other params)

完成。值得注意的是,这并不意味着另一端已收到任何东西。实际上,紧接在该行之后,数据很可能在发送机器的某个缓冲区中。这意味着它现在已经无法控制。如果您想要收据确认,远程端必须让您知道。

答案 1 :(得分:3)

Stream.Write是同步的,所以在写完成之前它总会阻塞你的线程。