NetworkStream.Write异步问题

时间:2013-02-12 18:27:23

标签: c# sockets networking asynchronous

我在C#中写入NetworkStream时遇到问题。从MSDN我读到:

  

Write方法阻塞,直到发送所请求的字节数或   抛出SocketException

嗯 - 就我而言,它的行为就像一个异步方法。线程没有被阻止。

这是一个代码示例,稍微启发一下情况:

TcpClient tcpcl = new TcpClient("192.168.1.128", 1337);
NetworkStream netst = tcpcl.GetStream();
byte[] will_send = File.ReadAllBytes(@"large_file_120_MB.mp4");
Console.WriteLine("Starting transmission...");
netst.Write(will_send, 0, will_send.Length);
Console.WriteLine("File has been sent !");
(... later instructions ...)

执行1秒后控制台的结果:

开始传播......

文件已发送!

立即显示第二条消息。后来的指示正在执行中。

同时服务器仍然接收文件,并且在其一侧一切正常。它变得更好 - 如果我杀了发送程序,在传输过程中,接收将不会停止。 Degugger清楚地表明应用已完全结束。然而,在完全停止之前,仍然会传输更多兆字节。

所以我的问题 - 有没有办法阻止主线程,直到Write方法完成?

1 个答案:

答案 0 :(得分:4)

MSDN描述应该更好地理解为

  

Write方法将阻塞,直到请求的字节数为止   写入本地网络缓冲区或抛出SocketException

即。写入将在另一端成功接收整个文件之前返回。

这也意味着当您关闭应用程序时,可能会继续发送当前在网络缓冲区中的任何内容。

阻止主线程直到成功接收整个文件的唯一方法是可能使用异步套接字,一旦发送完成,等待接收端发送某种确认,你必须实现