网络同步带来的bug
说一下之前遇到的bug,首先贴点代码
public class TcpSession : ITcpSession
{
private Socket _appSession;
private AutoResetEvent _signal = new System.Threading.AutoResetEvent(false);
…………
}
这个类里维护了一个sokect连接,和一个AutoResetEvent 对象,作用待会儿再说,首先一个连接产生(工作者线程,即真正使用连接的线程)以后,会加入到连接列表中,连接列表由一个"单独监听线程"维护,这个线程始终存在,每一次工作者线程发送完数据就会就会通过_signal 调用_signal.WaitOne(timeOut); (timeOut是int型的超时时间),将自己挂起,直到超时或监听线程监听到数据后通过所维护的列表调用_signal.set()将工作者线程唤醒。
但是这里存在一个隐含的bug,导致这个bug的关键就在于 这个timeOut,首先我们要执行两次数据发送,第一次发送完将自己挂起,等待被唤醒,但是由于网络慢,数据一直没来,导致超时。程序继续往后运行,工作者线程又发了一条数据将自己挂起,等待被唤醒,此时第一次发送数据的返回数据到了,监听线程就要执行唤醒操作,但是在等待的是第二次发送数据请求,也就导致了数据错误。
想了很多办法,都不是特别好使,最后用的是在发送数据是加上一个值这个值有工作者线程来确定,每次发送时更新此数据,接收到数据后进行比对看是不是这次请求的数据。
技术强的大牛们如果有什么好建议可以提一提啊。