采用同步方式封装异步操作(AutoResetEvent)
在C/S模式程序开发中需要实现一个函数,比如:
Code
它的实现需求是通过 TCP 向 Server 端请求指定用户 Id 所对应的用户名。
通常实现 socket 通讯的步骤是,我们先构造一个请求包,包含请求的指令和参数。
然后把它 Send() 出去。
Server 端接收到这个请求,查询符合条件的信息,并向客户端发送请求结果。
客户端的接收线程接收到 Server 端发来的信息,对其进行解析,并执行相应的操作。
这样的话,我势必需要在 GetUserName 函数中实现请求,并通过另一个函数去获取查询结果。
因为对于网络通讯来说,发起和获取可以说是异步的,这对于 GetUserName 函数的使用者来说显然太麻烦了。
那么怎么才能实现 string username=GetUserName(10); 这样的调用呢?
考虑过在 GetUserName 函数中做 while 循环,去不断检测所需的数据是否已返回,但这样开销太大。
于是想到了采用 AutoResetEvent。
Code
搞定!
这样的话 GetUserName 函数在执行 s.Send(data); 后会被挂起,直到超时或者 autoEvent 的事件状态被设置为终止状态。
然后才会执行之后的代码。
这样就能通过
string username=GetUserName(10); 这样的调用方式来返回用户名信息了。
这里只是简单说了下实现方法,其它具体的逻辑关系处理大家自己去想了,呵呵!