Система. Сеть. Mvc. Контроллер инициализирует

Однако (если я действительно понимаю различие между этими методами право), только один поток всегда выбирается для дальнейшего приобретения монитора.

, Который не корректен. o.notifyAll() следы весь из потоков, которые заблокированы в o.wait() вызовы. Потокам только позволяют возвратиться от o.wait() один за другим, но каждый из них будет получать их очередь.

<час>

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

В некоторых случаях, все потоки ожидания могут принять полезные меры, как только ожидание заканчивается. Примером был бы ряд потоков, ожидающих определенной задачи закончиться; как только задача закончилась, все потоки ожидания могут продолжить свой бизнес. В таком случае Вы использовали бы notifyAll () для пробуждения всех потоков ожидания одновременно.

Другой случай, например, взаимоисключающая блокировка, только один из потоков ожидания может сделать что-то полезное, будучи уведомленным (в этом случае получают блокировку). В таком случае Вы использовали бы , уведомляют () . Правильно реализованный, Вы могли использование notifyAll () в этой ситуации также, но Вы излишне разбудите потоки, которые ничего не могут сделать так или иначе.

<час>

Во многих случаях, код для ожидания условия будет записан как цикл:

synchronized(o) {
    while (! IsConditionTrue()) {
        o.wait();
    }
    DoSomethingThatOnlyMakesSenseWhenConditionIsTrue_and_MaybeMakeConditionFalseAgain();
}

Тот путь, если o.notifyAll() вызов будит больше чем один поток ожидания и первый для возврата из эти o.wait(), делает листы условием в ложном состоянии, то другие потоки, которые были пробуждены, вернутся к ожиданию.

8
задан DaveRandom 25 February 2013 в 20:35
поделиться

2 ответа

Я думаю, вы переопределяете неправильный метод. Попробуйте использовать OnActionExecuting или OnActionExecuted.

protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      if (something == true)
          filterContext.Result =  RedirectToAction("DoSomething", "Section");
      else
          base.OnActionExecuting(filterContext);
    }
15
ответ дан 5 December 2019 в 12:10
поделиться

Я не уверен, что это то, что вы хотите, но попробуйте следующее:

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
    if (something == true)
        RedirectToAction("DoSomething", "Section");
    else
        base.Initialize(requestContext);
}
-1
ответ дан 5 December 2019 в 12:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: