Асинхронные контроллеры в ASP.NET MVC - PullRequest
2 голосов
/ 23 января 2011

У меня есть веб-сайт для блогов, разработанный с использованием ASP.NET MVC 1. Последняя версия MVC включает функцию AsyncController.Это на самом деле требует некоторых дополнительных задач в разработке.Но как я могу использовать свой существующий код без изменения моего бизнес-уровня.

Некоторая часть кода выглядит следующим образом:

BlogPost post = new BlogPost();
post.GetPost(58345);

BlogComment comments = new BlogComment();
comments.GetComments(58345);

В соответствии с текущей средой, мне нужно дождаться запросазавершает две операции.Используя AsyncController, я могу сделать две операции одновременно.Но классы BlogPost и BlogComment необходимо изменить для поддержки асинхронных операций, таких как добавление EventHandlers, чтобы знать, завершена ли операция и т. Д.

Как выполнить асинхронную операцию без изменения существующего бизнес-уровня.

Ответы [ 2 ]

3 голосов
/ 23 января 2011

Вы можете сделать это:

public class BlogController : AsyncController
{
    private readonly IBlogRepository _repository;
    public BlogController(IBlogRepository repository)
    {
        _repository = repository;
    }

    public void ShowAsync(int id)
    {
        AsyncManager.OutstandingOperations.Increment(2);
        new Thread(() =>
        {
            AsyncManager.Parameters["post"] = _repository.GetPost(id);
            AsyncManager.OutstandingOperations.Decrement();
        }).Start();
        new Thread(() =>
        {
            AsyncManager.Parameters["comments"] = _repository.GetComments(id);
            AsyncManager.OutstandingOperations.Decrement();
        }).Start();
    }

    public ActionResult ShowCompleted(Post post, IEnumerable<Comment> comments)
    {
        return View(new BlogViewModel
        {
            Post = post,
            Comments = comments,
        });
    }  
}

Вы должны измерить производительность вашего приложения и решить, принесет ли введение асинхронного контроллера какое-либо значение для производительности.

2 голосов
/ 23 января 2011

Во-первых, почему вы думаете, что вам нужно сделать Async Controllers?У вас возникли проблемы с производительностью, которые, как вы думаете, Async помогут вам?Зачем усложнять ваше приложение обработкой Async, если она вам на самом деле не нужна?

Async действительно предназначена для обработки гораздо более масштабного масштабирования или когда вам нужно выполнять не связанные с процессором операции в ваших контроллерах, которые могут потребоватьдолгое время исполнять.

Во-вторых, я думаю, вы немного озадачены тем, как работают асинхронные контроллеры.В большинстве случаев вам не нужно изменять свой бизнес-уровень, вам просто нужно создать асинхронную "прокладку", чтобы обернуть бизнес-уровень.Async не означает «многопоточный».он по-прежнему будет выполнять один поток на запрос, и вы все равно будете называть свою бизнес-логику однопоточной (если только вы не пишете код для многопоточной работы).

Все асинхронные контроллеры позволяют лучше использовать потокБассейн.Если у вас есть потоки, которые не связаны с процессором, они могут быть возвращены в пул потоков в ожидании повторной активации вашего запроса, что позволяет лучше использовать пул потоков, а не использовать поток, который ничего не делает, кроме ожидания.

Если вам нужно вызвать несколько операций, вы используете свойство AsyncManager.OutstandingOperations, чтобы контролировать, сколько операций должно быть выполнено для выполнения запроса.

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