【问题标题】:How can I implement my own async callback in C# wp7 silverlight?如何在 C# wp7 silverlight 中实现我自己的异步回调?
【发布时间】:2011-09-10 06:23:31
【问题描述】:

我正在尝试将引擎及其单元测试移植到 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);
    }
} 

不确定我是否也 100% 适应 lambda 表达式,所以如果将它们删除,那就更好了! ;)

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

    你的问题有点奇怪——你用同步版本包装了一个异步框架,并用一个异步版本重新包装了 那个。听起来你正在为自己创造额外的工作,以忠于你的港口。您还将使用一些额外的内存来保持额外的线程处于活动状态(至少 1MB 用于堆栈)。

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

    【讨论】:

    • 我已经移植了整个线程流,所以我想保持这种方式而不是重写整个移植的后端。所以,问题是,我如何将它包装在异步回调中?谢谢
    • 答案已更新,其中包含指向可以帮助您创建异步版本的页面的链接 - 我仍然认为您应该重新考虑 :)
    • 谢谢,这正是我想要的!直接链接其实是msdn.microsoft.com/en-us/magazine/cc163467.aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    相关资源
    最近更新 更多