1

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

在发送请求的字节数或抛出 SocketException 之前,Write 方法会一直阻塞

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

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

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 方法完成?

4

1 回答 1

4

MSDN 描述也许应该更好地理解为

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

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

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

在成功接收到整个文件之前阻塞主线程的唯一方法是潜在地使用异步套接字,一旦发送完成,请等待接收端发送某种确认,您必须实现这一点。

于 2013-02-12T18:33:19.020 回答