Как я могу реализовать свой собственный асинхронный обратный вызов в C # wp7 silverlight? - PullRequest
0 голосов
/ 10 сентября 2011

Я пытаюсь перенести двигатель в 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% доволен лямбда-выражениями, так что, если они будут удалены, даже лучше! ;)

Спасибо

1 Ответ

2 голосов
/ 10 сентября 2011

Вам не нужно создавать новый поток для обработки обратного вызова EndRequest или EndResponse - они будут вызываться для вас в фоновом потоке из ThreadPool.Так что что-то вроде вашего первого примера кода должно работать.

Если вам не нравятся вложенные лямбда-выражения, просто объявите именованные методы :).Вы можете передать информацию о состоянии в методы Begin ..., которые вы можете получить в объекте результата.

То, что вы спрашиваете, довольно странно - вы оборачиваете асинхронный фреймворк с синхронизированной версией и переворачиваете это с асинхронной версией.Похоже, вы создаете дополнительную работу для себя, чтобы оставаться верным своему порту.Вы также будете использовать некоторую дополнительную память, чтобы поддерживать дополнительный поток, ничего не делая (по крайней мере, 1 МБ для стека).

Если вы все еще хотите это сделать, проверьте эту ссылку хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...