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

本文关键字:我自己 实现 自己的 异步 回调 silverlight wp7 | 更新日期: 2023-09-27 18:08:03

我正在尝试将一个引擎移植到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);
    }
} 

我需要实现异步接口或类似的东西吗?

我想让它做这样的事情:

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表达式也100%满意,所以如果它们被删除,那就更好了!;)

谢谢

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

你不需要创建一个新的线程来处理EndRequest或EndResponse回调——它们将在ThreadPool的后台线程中为你调用。因此,类似于第一个代码示例的东西应该可以工作。

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

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

如果你还想这样做,请点击这个链接。