[问题] Socket send too fast & Timer overlap

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

Links booklink

Contact Us: admin [ a t ] ucptt.com