您的位置:首页 > 其它

采用同步方式封装异步操作(AutoResetEvent)

2008-09-05 14:00 267 查看
在C/S模式程序开发中需要实现一个函数,比如:

Code

AutoResetEvent autoEvent = new AutoResetEvent(false); //将初始状态设置为非终止

/// <summary>

/// 根据用户 ID 查询用户名

/// </summary>

/// <param name="id">用户 ID</param>

/// <returns>用户名</returns>

public string GetUserName(int id)

{

/*

* 这里放置请求封包构造代码

*/

byte[] data=packet.GetData();

s.Send(data);

if (autoEvent.WaitOne(5000, false)) //这里定义了 5 秒的超时时间

{

return result; //这个是示例,result 从 RecvUserName 中进行赋值

}

else

{

throw new Exception("服务器查询超时!");

}

}

/*

*当 socket 读取线程读取到 Server 返回的用户名信息的封包头信息后调用 RecvUserName 函数

* socket 读取线程部分代码略

*/

/// <summary>

/// 接收服务器返回信息

/// </summary>

private void RecvUserName()

{

/*

* 这里编写封包拆解代码

*/

result = username;

autoEvent.Set(); //将事件状态设置为终止状态,允许等待线程继续。

}

搞定!

这样的话 GetUserName 函数在执行 s.Send(data); 后会被挂起,直到超时或者 autoEvent 的事件状态被设置为终止状态。

然后才会执行之后的代码。

这样就能通过

string username=GetUserName(10); 这样的调用方式来返回用户名信息了。

这里只是简单说了下实现方法,其它具体的逻辑关系处理大家自己去想了,呵呵!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: