我正在尝试将引擎移植到C#WP7 silverlight中,以及它的单元测试。因为它使用http请求,所以它需要是框架所指示的异步。我正在移植的Android版引擎在工作线程上使用同步阻塞套接字。它会在整个操作完成时调用回调(而不仅仅是http请求)。
问题 - 我如何包装回调机制,以便它可以在[异步]单元测试中使用异步回调?
我希望它能做到这样的事情:
using System;
using System.Net;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.Silverlight.Testing;
[TestClass]
public class WebRequestsTests : WorkItemTest
{
[TestMethod, Asynchronous]
public void TestWebRequest()
{
var webRequest = WebRequest.CreateHttp("http://www.stackoverflow.com");
webRequest.BeginGetResponse(result =>
{
EnqueueCallback(() =>
{
WebResponse response = webRequest.EndGetResponse(result);
// process response
TestComplete(); // async test complete
});
}, null);
}
}
我是否需要实现IAsync接口或类似的东西?
我希望它能做到这样的事情:
using System;
using System.Net;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.Silverlight.Testing;
[TestClass]
public class WebRequestsTests : WorkItemTest
{
[TestMethod, Asynchronous]
public void TestWebRequest()
{
MyThread thread = new MyThread();
thread.Start(result =>
{
EnqueueCallback(() =>
{
WebResponse response = thread.EndGetResult(result);
// process response
TestComplete(); // async test complete
});
}, null);
}
}
不确定我对lambda表达式也非常满意,所以如果删除它们,那就更好了! ;)
由于
答案 0 :(得分:2)
您不需要创建新线程来处理EndRequest或EndResponse回调 - 这些将在ThreadPool的后台线程上为您调用。所以像你的第一个代码示例应该有用。
如果你不喜欢嵌套的lambdas,只需声明命名方法:)。您可以在Begin ...方法中传递状态信息,您可以在结果对象中检索这些信息。
你所问的有点奇怪 - 你正在用同步版本包装一个异步框架,并用异步版本重新包装那个。听起来你正在为自己创造额外的工作,以保持对你的港口的忠诚。你还将使用一些额外的内存来保持额外的线程无所事事(至少为1MB的堆栈)。
如果您仍想这样做,请查看this link。