簡體   English   中英

為什么 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 上的“關閉”調用在 C# 和 Java 中表現不同?

[英]Why does the “Close” call on a stream behave differently in C# and in Java?

考慮以下場景,在 Java 中編寫了一個 servlet,一旦連接到該 servlet,它就開始寫入 OutputStream,比如說 1000 萬字節,一次 1 個字節。

您有一個客戶端程序,它讀取 servlet 的響應 stream 並讀取 100 個字節並調用 close。 現在,如果您的客戶端程序在 Java 中,則流立即關閉並且服務器停止發送內容,但是如果客戶端程序在 C# 中,則關閉調用需要很長時間才能完成,因為它顯然是在等待服務器完成所有1000 萬字節。

所以,我對此有兩個問題,

  1. 為什么 C# 表現不同?
  2. 如何確保 C# stream 上的 Close 調用立即關閉 stream 並且不允許服務器繼續發送數據?

任何指針將不勝感激:-)

我假設 sockets 在這里。 我懷疑 Java 實現只是關閉客戶端套接字,可能會導致服務器出錯,而 C# 版本對服務器稍微友好並等待它確認關閉請求。 由於服務器正忙於發送數據,因此在完成發送之前它不會獲得 - 或至少不處理 - 關閉請求。

可以這樣想:有人在您的前門試圖向您推銷一些東西並且不會被打斷。 你可以當着他們的面關上門,讓他們立刻關上門,或者你可以等到他們說完再讓他們離開。

為了解決這個問題,也許您可以創建一個工作線程來打開 stream,等待 100 個字節,然后關閉。 與此同時,當線程最終關閉時,您的程序可以做它需要做的任何事情。

所以,我終於在幾周前弄清楚了這一點,並與微軟進行了驗證。 The difference between C# and Java is the fact that in Java close call closes the request/connection as well, while in C#, it doesn't happen unless you follow it up with an xxxRequest.Abort() call. 希望這對其他人也有幫助。

暫無
暫無

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

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