C # Web Api GetAsync + MVC 3.0 Асинхронный контроллер - PullRequest
0 голосов
/ 12 июля 2011

Я просто хочу, чтобы каждый получил отзыв о следующем асинхронном контроллере, использующем Web Api HttpClient. Это выглядит очень грязно, есть ли способ сделать его чище? У кого-нибудь есть хорошая оболочка для объединения нескольких асинхронных задач вместе?

public class HomeController : AsyncController
{
    public void IndexAsync()
    {
        var uri = "http://localhost:3018/service";
        var httpClient = new HttpClient(uri);

        AsyncManager.OutstandingOperations.Increment(2);
        httpClient.GetAsync(uri).ContinueWith(r =>
        {
            r.Result.Content.ReadAsAsync<List<string>>().ContinueWith(b =>
            {
                AsyncManager.Parameters["items"] = b.Result;
                AsyncManager.OutstandingOperations.Decrement();
            });
            AsyncManager.OutstandingOperations.Decrement();
        });
    }

    public ActionResult IndexCompleted(List<string> items)
    {
        return View(items);
    }
}

Ответы [ 2 ]

0 голосов
/ 07 августа 2011

Вы можете взглянуть на http://pfelix.wordpress.com/2011/08/05/wcf-web-api-handling-requests-asynchronously/.

. Он содержит пример, основанный на методе итератора задачи (http://blogs.msdn.com/b/pfxteam/archive/2009/06/30/9809774.aspx) для цепочки асинхронных операций.

0 голосов
/ 13 июля 2011

Вы, кажется, используете немного для многих асинхронных вызовов и AsyncManager.OutstandingOperations.Decrement (). Следующего кода достаточно для асинхронной загрузки информации о фото Flickr с использованием YQL.

public class HomeController : AsyncController
{
    public void IndexAsync()
    {
        var uri = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20flickr.photos.recent";
        var httpClient = new HttpClient(uri);

        AsyncManager.OutstandingOperations.Increment();
        httpClient.GetAsync("").ContinueWith(r =>
            {
                var xml = XElement.Load(r.Result.Content.ContentReadStream);

                var owners = from el in xml.Descendants("photo")
                                select (string)el.Attribute("owner");

                AsyncManager.Parameters["owners"] = owners;
                AsyncManager.OutstandingOperations.Decrement();
            });
    }

    public ActionResult IndexCompleted(IEnumerable<string> owners)
    {
        return View(owners);
    }
}
...