如何在C#wp7 silverlight中实现自己的异步回调?

时间:2011-09-10 06:23:31

标签: c# silverlight unit-testing windows-phone-7

我正在尝试将引擎移植到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表达式也非常满意,所以如果删除它们,那就更好了! ;)

由于

1 个答案:

答案 0 :(得分:2)

您不需要创建新线程来处理EndRequest或EndResponse回调 - 这些将在ThreadPool的后台线程上为您调用。所以像你的第一个代码示例应该有用。

如果你不喜欢嵌套的lambdas,只需声明命名方法:)。您可以在Begin ...方法中传递状态信息,您可以在结果对象中检索这些信息。

你所问的有点奇怪 - 你正在用同步版本包装一个异步框架,并用异步版本重新包装那个。听起来你正在为自己创造额外的工作,以保持对你的港口的忠诚。你还将使用一些额外的内存来保持额外的线程无所事事(至少为1MB的堆栈)。

如果您仍想这样做,请查看this link