2015-02-11 5 views
1

у меня есть какое-то действие внутри контроллер любит:запроса MVC Ajax без блокировки основного потока

public class ValuesController : Controller 
{ 
    [HttpPost] 
    public string GetInfo() 
    { 
     Thread.Sleep(30000); // logics imitation 
     return "result"; 
    } 
} 

когда я отправить запрос с клиентской стороны на этом мероприятии я буду принимающим «Main блокировки темы» (как тупик), а ожидая «имитации логики» как я могу это предотвратить? уже пробовал:

public class ValuesController : Controller 
{ 
    [HttpPost] 
    public async Task<string> GetInfo() 
    { 
     return await Task.Factory.StartNew(() => 
     { 
      Thread.Sleep(30000); 
      return "result"; 
     });; 
    } 
} 

Не работает ...

уже смотрели (ASP.NET MVC and Ajax, concurrent requests?), но SessionState.ReadOnly путь не для меня ...

также попытался с помощью SVC-службы вместо контроллера но имеют те же проблемы.

+0

Почему вы хотите, чтобы нить спала вообще? –

+0

Потому что я буду ждать другого результата извне. –

+0

Просто чтобы уточнить - что вы действительно пытаетесь достичь? Вы просто хотите, чтобы клиент «стрелял и забыл»? Вы хотите, чтобы потоки были доступны в пуле потоков ASP.Net для запросов (в отличие от длительных задач)? –

ответ

1

MVC по умолчанию блоков параллельных сессий, и есть только один способ избежать этого:

[SessionState(SessionStateBehavior.ReadOnly)] 

Attribute на Controller и четко отделяющие логик с использованием записи и чтения сессий.

1

Этот вопрос был отправлен моим коллегой. Да, у нас есть ситуация, когда нам нужно «стрелять и забывать» (мы пытаемся вызывать действия асинхронно, когда одновременно выполняются разные действия, но все же нам удалось только вызвать действия один за другим)

+0

Если вы хотите, чтобы клиент просто делал запросы и не беспокоился о значимом ответе, я бы предложил посмотреть [этот вопрос] (http://stackoverflow.com/questions/6374860/fire-and-forget-with-asp- нетто-MVC). В двух словах - не стоит беспокоиться об асинхронном контроллере. Поток, который обрабатывает запрос, закручивает новую задачу (или поток) и сразу возвращается. Эта новая задача или тема посвящена этому бизнесу. Недостатком является то, что вы действительно не знаете, если вы его где-то не хранили, результат долгой логики. –

+0

нужно уметь «стрелять и забывать», но также иметь доступный результат получения после ожидания «без возврата пустого результата» –

+0

Если я правильно понимаю, случай находится в сеансе, MVC запрещает использование параллельных сеансов и без атрибута (SessionState.ReadOnly) не решает эту проблему. –

Смежные вопросы