采用同步方式封装异步操作(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); 这样的调用方式来返回用户名信息了。

 

这里只是简单说了下实现方法,其它具体的逻辑关系处理大家自己去想了,呵呵!

 

 

posted @ 2008-09-05 14:00  FP0991  阅读(2084)  评论(3编辑  收藏  举报