xdingding  
日历
<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789
统计
  • 随笔 - 26
  • 文章 - 0
  • 评论 - 35
  • 引用 - 0

导航

常用链接

留言簿(11)

我参与的团队

随笔分类

随笔档案

最新随笔

搜索

  •  

积分与排名

  • 积分 - 31106
  • 排名 - 1337

最新评论

阅读排行榜

评论排行榜

 
唉真是有意思,以前在博客园总写些Java文章,现在搬过来又总写.net 。不过两者有很多借鉴
以下就是我借鉴一个java的mail
 

最近在写一个使用XMPP协议(gtalkjabber使用的) 即时通讯的客户端,在.net下使用了一个Open Sourceags. 这个库是基于Windows Socket异步方式来做底层架构的。这就存在NUnit的使用问题,

如果按照一般Unit使用过程,在客户端发出请求后,因为异步原因,会不等接收数据的delegate事件被调起,Test函数就会提前退出。

为此到网上海google了一番,均无此法,后来搜到一封网上的英文mailmail里写了几行好像测试异步访问Web服务器的测试程序,没头没尾看不出究竟干什么的(他们是讨论一个feature问题),但里面几行给了我很大提示,其中有一行

 if (!reset.WaitOne(timeout, true))

这似乎就是我要寻找的提示,嗯用线程同步信号不错,估计可以解决,经过2个小时反复试验终于出炉啦,呵呵!

 

大体程序如下:

static ManualResetEvent reset;

private const int timeout = 3000;

 

[TestFixtureSetUp]

public void FixtureSetUp()

{

reset = new ManualResetEvent(false);

}

 

[TestFixtureTearDown]

public void FixtureTearDown()

{

reset.Close();

}

 

[Test]

public void TestConnect()

{

。。。。。

msgControl.Connect(connectInfo);

 

Assert.AreNotEqual("", msgControl.Status);

 

msgControl.RecvStringEvent += new RecvStringCallback(msgControl_RecvStringEvent);

 

reset.Reset();

 

// note for some reason r.AsyncWaitHandle.Wait won't work as expected

// if (!r.AsyncWaitHandle.WaitOne (timeout, true))

if (!reset.WaitOne(timeout, true))

{

if (recvTimes == 0)

{

Assert.Ignore("Timeout");

}

else

{

Assert.AreEqual(8, recvTimes, "not recv 8 times");

}

}

 

Assert.IsNotNull(message, message);

}

 

private int recvTimes = 0;

 

void msgControl_RecvStringEvent(string msgText)

{

recvTimes++;

message = msgText;

if (recvTimes > 9)

{

recvTimes = 0;

reset.Set();

}

}

 

希望能对编写异步通讯的人有所帮助

posted on 2006-08-08 22:57 般若菩提 阅读(1050) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 
 
Copyright © 般若菩提 Powered by: 博客园 模板提供:沪江博客