[問題] Socket send too fast & Timer overlap

看板C_Sharp (C#)作者 ( )時間8年前 (2017/04/17 16:33), 編輯推噓3(3025)
留言28則, 7人參與, 最新討論串1/1
如題 兩個問題 1.Socket send too fast 之前問過有關Socket的問題 不過後來抓出問題好像不在Socket的Connected判斷身上 而是當Socket重複送太快的時候 會造成錯誤然後Socket就斷線了 目前如果要送訊息,會把訊息Queue在Arrary裡面 然後以100ms去跑一個Timer OnTimer內再用While迴圈去把所有Array的訊息都送出去 但好像只要連續送幾個訊息就會當了 就算是一來一往,只要區網速度太快也會造成一樣問題 這時候該用什麼方法解決比較好? 原本是想說在送一個訊息之後Delay幾ms 或者直接將幾ms內呼叫的Send指令給pass掉 但這些都不是我要的 有沒有辦法以最安全的方法,讓訊息能以可能的最快時間全部發送出去? 2.Timer overlap 這是另一個問題 一個主Thread裡面以100ms跑Timer OnTimer內用foreach跑所有子物件的OnTimer 然後子物件的OnTimer內才會去處理所有各自的事情 原先以為,統一由主Thread去呼叫,可以避免多執行緒的交錯問題 結果卻發現還是有交錯 後來查詢跟實驗的結果,發現是Timer的Overlap問題 也就是說在還沒完成所有子物件的OnTimer之前 100ms就到了所以呼叫第二次的主Thread的OnTimer 然後就跑出了意外的結果 搜尋的結果 嘗試使用lock跟timer.stop跟timer.start 的確讓交錯問題消失了 但產生另一個問題是 當子物件數量一多,整個OnTimer的迴圈就變慢很多 造成主Thread無法以100ms穩定的跑 雖然說要做的事應該是需要堆疊完成才對 但不知道有沒有辦法讓主Thread要做的事穩定進行 然後子物件的OnTimer判斷獨立出來延遲? 還是說這樣的想法有根本上的錯誤? 實際上應該是要把兩個Timer分開? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.128.131.226 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1492418032.A.2C4.html

04/17 18:04, , 1F
好像找到一些關鍵字
04/17 18:04, 1F

04/17 18:04, , 2F
不用Send改用BeginSend,然後sendDone.WaitOne()
04/17 18:04, 2F

04/17 18:05, , 3F
Timer的部分還在思考...
04/17 18:05, 3F

04/17 19:39, , 4F
callback?
04/17 19:39, 4F

04/17 21:16, , 5F
你把事情搞得好複雜,你到底想不想讓他們非同步(重疊)跑?
04/17 21:16, 5F

04/17 22:40, , 6F
現在想法也是有點混亂,有些要同步有些不同步的
04/17 22:40, 6F

04/17 22:41, , 7F
主要是主Thread想讓他保持100ms跑
04/17 22:41, 7F

04/17 22:41, , 8F
但如果裡面的子物件使用同步跑且順序等,數量一多就
04/17 22:41, 8F

04/17 22:42, , 9F
會超過100ms,而且越多越久。
04/17 22:42, 9F

04/17 22:42, , 10F
但使用非同步的時候,有些判斷式是需要偵測其他物件
04/17 22:42, 10F

04/17 22:42, , 11F
狀態的,然後就會發生兩邊同時修改同時判斷成功
04/17 22:42, 11F

04/17 22:43, , 12F
所以才會覺得非同步會造成一些問題。
04/17 22:43, 12F

04/17 23:33, , 13F
聽你的說法感覺你不應該用timer
04/17 23:33, 13F

04/17 23:37, , 14F
你看要不要再把問題描述的具體一點,主執行緒100ms是只負
04/17 23:37, 14F

04/17 23:37, , 15F
責啟動或加入工作(Task)嗎?
04/17 23:37, 15F

04/17 23:41, , 16F
目前看起來你的子工作各自有各自的timer在執行,不太能理
04/17 23:41, 16F

04/17 23:41, , 17F
解你為何要這樣做
04/17 23:41, 17F

04/18 14:14, , 18F
例如說把訊息queue在array,然後排程去從array取出來這點就
04/18 14:14, 18F

04/18 14:14, , 19F
怪怪的,通常會直接放進一個BlockingQueue,然後一個thread
04/18 14:14, 19F

04/18 14:15, , 20F
固定從這個queue前端取東西一直送就好,沒東西自然會停著等
04/18 14:15, 20F

04/18 14:16, , 21F
要調頻率就動這thread沒有平行執行的問題
04/18 14:16, 21F

04/18 14:17, , 22F
你還是把需求講清楚一點,看有沒有從根本架構修改的方法
04/18 14:17, 22F

04/18 22:09, , 23F
Thread+同步, 或者單執行許+非同步
04/18 22:09, 23F

04/19 01:26, , 24F
回2..在timer要做事情之前用lock(obj){}包住
04/19 01:26, 24F

04/19 01:26, , 25F
他第二次跑的時候如果發現還在lock..就會skip過去
04/19 01:26, 25F

04/19 02:36, , 26F
你什麼時候有Critical Section進不去就會被跳過的錯覺了
04/19 02:36, 26F

04/19 13:28, , 27F
sorry想錯了,的確不會skip,剛查了可試Monitor.TryEnter
04/19 13:28, 27F

04/24 11:14, , 28F
感覺你無法確認OnTimer時上一次TIMER的工作是否做完...
04/24 11:14, 28F
文章代碼(AID): #1Oz7tmB4 (C_Sharp)
文章代碼(AID): #1Oz7tmB4 (C_Sharp)