none
一個TCPClient / StreamReader 和多線程問題 RRS feed

  • 問題

  • 我在使用VB.NET語言,寫一個ASP.NET的NNTP程式
    但因為效能問題,我把整個程式搬向Windows Form,但問題依然,想問問各位大大.

    我使用TCPClient, StreamReader,StreamWriter 去實現與NNTP Server溝通,一切都正常.

    但問題是如下載百多個Subject時,換句話說,要進行百多次StreamReader.Read()的時間非常冗長.
    我沒有使用Threading,因為如使用Threading,所接收的內容會一樣.
    在Google上搜查了差不多兩星期後,看過很多高手所寫的TCPClient程序,一般
    在Protected Sub上都有一句 <MethodImpl(MethodImplOptions.Synchronized)>

    我再查查後,這個是好像叫做線程同步,可以解決使用Threading時,進行For ... Next 會回傳同一結果的方法.但我並沒有實作,故想問問,各高手大大.我的問題,是不是和沒有使用<MethodImpl(MethodImplOptions.Synchronized)>有關?

    因我看過鏈鏈大大的NNTP Reader都是很快速,並沒有我的問題
    2006年8月23日 下午 02:42

解答

  • 1. 不建議跑多緒。

    部份 News Server 不允許同一電腦多線登入,有可能會被當成廣告信軟體直接踢掉。

    頻寬就是那麼大,快不起來也沒辦法。

    NNTP 還好,但是同一程式碼拿來跑 POP3 時,POP3 是用登入時信箱內存在的信件數來回應,要是兩線登入時的短暫時間差距下,中間剛好塞進來一封廣告信,就會變成序號有偏差,想要加速讀取反而是浪費流量而已。

    當然,你做 Windows Form 的情況下,可以另開一個執行緒來跑,避免視窗無回應,但是跑 NNTP 連線的只需要一個執行緒,你可以針對每個 News Server 開一個執行緒,但不是對同一個 News Server 開多個執行緒。

    2. 我的網站是只更新最新的,每次下載下來的內容都存到資料庫,來節省不必要的網路頻寬,而且我是先顯示既有的信件,在使用者瀏覽器下載圖檔及瀏覽文章標題時,才利用那個時間差來下載新的信件。若是新開一個討論區,從頭跑到尾,那個慢也是沒辦法的。你看 OE 也是每個 newsgroup 都有對應一個 dbx 來存信件,也是一個小型的資料庫架構。

    2006年8月24日 上午 03:15
    版主