ASP.net MVC - AsyncController и Session - PullRequest
2 голосов
/ 04 января 2012

Я играл с асинхронными контроллерами в ASP.net MVC просто чтобы посмотреть, как они работают. В одном из моих методов асинхронного действия я хотел смоделировать длительный метод, выполнив несколько циклов и выполнив Thread.Sleep:

for(int x = 1; x <= 10; x++) {
    Thread.Sleep(1000);

    Session["progress"] = x * 10;
}

Мне нужен быстрый и грязный способ сообщить о ходе длительной операции, поэтому я просто использовал состояние сеанса. Я бы не использовал его в обычном приложении, но заметил, что в другом не асинхронном методе действия это состояние сеанса не сохраняется:

public ActionResult ReportProgress() {
    int progress = 0;

    if( Session["progress"] != null ) {
        progress = (int)Session["progress"];
    }

    return Json(progress);
}

В методе ReportProgress эта переменная сеанса всегда равна нулю. Когда я отлаживаю другой асинхронный метод, сеанс сохраняется.

Кто-нибудь понимает, почему асинхронный метод и синхронный метод, по-видимому, не имеют одинаковый сеанс?

1 Ответ

3 голосов
/ 04 января 2012

Эти ссылки должны дать вам представление:

Использование асинхронного контроллера в ASP.NET MVC (работа с шаблоном BeginMethod / EndMethod)

Цитата:

Если метод асинхронного действия вызывает службу, которая предоставляет методы с использованием шаблона BeginMethod / EndMethod, метод обратного вызова (то есть метод, который передается в качестве параметра асинхронного обратного вызова методу Begin) можетвыполнить в потоке, который не находится под контролем ASP.NET.В этом случае HttpContext.Current будет иметь значение null , и приложение может столкнуться с условиями гонки, когда оно получит доступ к членам класса AsyncManager, таким как Parameters.Чтобы убедиться, что у вас есть доступ к экземпляру HttpContext.Current и чтобы избежать состояния гонки, вы можете восстановить HttpContext.Current, вызвав Sync () из метода обратного вызова.

Что вы хотите сделать здесьэто передать результат в метод xxxCompleted действия вашего контроллера со словарем AsyncManagaer.Paramater и установить там сеанс.

Вы в безопасности внутри xxxCompleted метода.Смотрите ссылку, которую я дал.Это проведет вас через процесс.

Но имейте в виду, что этот подход не является способом продвижения вперед.Асинхронные операции в ASP.NET MVC будут значительно изменены в следующей версии с доступностью ключевого слова await.

Дополнительная информация:

Поддержка задач для асинхронных контроллеров

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