簡體   English   中英

NetworkStream.Write異步問題

[英]NetworkStream.Write asynchronous issue

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

MSDN描述應該更好地理解為

Write方法將阻塞,直到請求的字節數寫入本地網絡緩沖區或拋出SocketException

即寫入將在另一端成功接收整個文件之前返回。

這也意味着當您關閉應用程序時,可能會繼續發送當前在網絡緩沖區中的任何內容。

阻止主線程直到成功接收整個文件的唯一方法是可能使用異步套接字,一旦發送完成,等待接收端發送某種確認,您必須實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM