我最初在發送數據時有一個競爭條件,問題是我允許使用多個SocketAsyncEventArgs發送數據,但第一個數據包在第二個數據包之前沒有完全發送,是因爲我有它,所以如果數據不適合緩衝區,它會循環直到發送所有數據,並且第一個數據包比第二個數據包很小,所以第二個數據包被髮送併到達客戶端在第一個包之前。按照SocketAsyncEventArgs的順序發送數據
我已經解決了這個問題,方法是將一個SocketAyncEventArgs分配給用於發送數據的打開連接,並使用信號量來限制對它的訪問,並在完成後返回SocketAsyncEventArgs。
現在,這工作正常,因爲所有的數據發送,回撥完成後準備下一次發送。與此相關的問題是,當我想隨機發送數據到打開的連接時,以及當發送大量數據阻止我的線程時,它導致阻塞。
我正在尋找解決這個問題的方法,我想有一個隊列,當請求發送數據時,它只是將數據包添加到隊列中,然後1個SocketAsyncEventArgs只是循環發送該數據。
但是我怎樣纔能有效地做到這一點,同時仍然是可擴展的?我希望儘可能避免阻塞,同時按照請求發送的順序發送我的數據包。
感謝任何幫助!
所以我會做一個隊列,當某些東西被添加到隊列中時,檢查一下發送操作是否已經在進行中,如果不是,那麼啓動一個並且它一直循環直到隊列爲空?一旦發送隊列中的隊列變爲空,則將寫入計數更改爲0,並在需要時重新啓動發送進程? – Matty 2012-07-25 12:12:07
@mattysouthall正好。請注意,「保持循環」有一個* async *循環,而不是一個常規循環('while')等等。所以基本上,每當你得到「完成」事件,並且你檢查了它是OK等,然後啓動下一個去。 – 2012-07-25 13:03:12
全部完成,工作很棒!我的日誌顯示它正在按照我想要的方式行事,謝謝! – Matty 2012-07-25 15:20:56