作者AizawaYuuiti ( )
看板C_Sharp
标题[问题] Socket send too fast & Timer overlap
时间Mon Apr 17 16:33:49 2017
如题
两个问题
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://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1492418032.A.2C4.html
1F:→ AizawaYuuiti: 好像找到一些关键字 04/17 18:04
2F:→ AizawaYuuiti: 不用Send改用BeginSend,然後sendDone.WaitOne() 04/17 18:04
3F:→ AizawaYuuiti: Timer的部分还在思考... 04/17 18:05
4F:推 s89227: callback? 04/17 19:39
5F:→ Litfal: 你把事情搞得好复杂,你到底想不想让他们非同步(重叠)跑? 04/17 21:16
6F:→ AizawaYuuiti: 现在想法也是有点混乱,有些要同步有些不同步的 04/17 22:40
7F:→ AizawaYuuiti: 主要是主Thread想让他保持100ms跑 04/17 22:41
8F:→ AizawaYuuiti: 但如果里面的子物件使用同步跑且顺序等,数量一多就 04/17 22:41
9F:→ AizawaYuuiti: 会超过100ms,而且越多越久。 04/17 22:42
10F:→ AizawaYuuiti: 但使用非同步的时候,有些判断式是需要侦测其他物件 04/17 22:42
11F:→ AizawaYuuiti: 状态的,然後就会发生两边同时修改同时判断成功 04/17 22:42
12F:→ AizawaYuuiti: 所以才会觉得非同步会造成一些问题。 04/17 22:43
13F:→ Litfal: 听你的说法感觉你不应该用timer 04/17 23:33
14F:→ Litfal: 你看要不要再把问题描述的具体一点,主执行绪100ms是只负 04/17 23:37
15F:→ Litfal: 责启动或加入工作(Task)吗? 04/17 23:37
16F:→ Litfal: 目前看起来你的子工作各自有各自的timer在执行,不太能理 04/17 23:41
17F:→ Litfal: 解你为何要这样做 04/17 23:41
18F:→ ssccg: 例如说把讯息queue在array,然後排程去从array取出来这点就 04/18 14:14
19F:→ ssccg: 怪怪的,通常会直接放进一个BlockingQueue,然後一个thread 04/18 14:14
20F:→ ssccg: 固定从这个queue前端取东西一直送就好,没东西自然会停着等 04/18 14:15
21F:→ ssccg: 要调频率就动这thread没有平行执行的问题 04/18 14:16
22F:→ ssccg: 你还是把需求讲清楚一点,看有没有从根本架构修改的方法 04/18 14:17
23F:推 jizang: Thread+同步, 或者单执行许+非同步 04/18 22:09
24F:推 jinmin88: 回2..在timer要做事情之前用lock(obj){}包住 04/19 01:26
25F:→ jinmin88: 他第二次跑的时候如果发现还在lock..就会skip过去 04/19 01:26
26F:→ Litfal: 你什麽时候有Critical Section进不去就会被跳过的错觉了 04/19 02:36
27F:→ jinmin88: sorry想错了,的确不会skip,刚查了可试Monitor.TryEnter 04/19 13:28
28F:→ AWEN221: 感觉你无法确认OnTimer时上一次TIMER的工作是否做完... 04/24 11:14