唉真是有意思,以前在博客园总写些Java文章,现在搬过来又总写.net 。不过两者有很多借鉴
以下就是我借鉴一个java的mail
最近在写一个使用XMPP协议(gtalk和jabber使用的) 即时通讯的客户端,在.net下使用了一个Open Source库ags. 这个库是基于Windows Socket异步方式来做底层架构的。这就存在NUnit的使用问题,
如果按照一般Unit使用过程,在客户端发出请求后,因为异步原因,会不等接收数据的delegate事件被调起,Test函数就会提前退出。
为此到网上海google了一番,均无此法,后来搜到一封网上的英文mail,mail里写了几行好像测试异步访问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();
}
}
希望能对编写异步通讯的人有所帮助