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 秒後のコンソールの結果:

送信を開始しています...

ファイルが送信されました!

2 番目のメッセージがすぐに表示されます。後の命令が実行されています。

その間、サーバーは引き続きファイルを受信し、その側ではすべてが正常に機能します。それは良くなります-送信プログラムを強制終了すると、送信中に受信が停止しません。Degugger は、アプリが完全に終了したことを明確に示しています。ただし、受信が完全に停止するまで、さらに数メガバイトが送信されます。

だから私の質問 - Write メソッドが終了するまで、メインスレッドをブロックする方法はありますか?

4

1 に答える 1

4

MSDNの説明は、おそらく次のように読む方がよいでしょう。

Writeメソッドは、要求されたバイト数が ローカルネットワークバッファに書き込まれるか、SocketExceptionがスローされるまでブロックされます

つまり、ファイル全体がもう一方の端で正常に受信される前に、書き込みが返されます。

これは、アプリケーションを閉じるときに、現在ネットワークバッファにあるものが引き続き送信される可能性があることも意味します。

ファイル全体が正常に受信されるまでメインスレッドをブロックする唯一の方法は、非同期ソケットを使用する可能性があり、送信が完了したら、受信側から何らかの確認が送信されるまで待機します。これを実装する必要があります。

于 2013-02-12T18:33:19.020 に答える