2015-02-11 126 views
1

我有一些动作里面控制器喜欢:MVC Ajax请求不阻塞主线程

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

当我上这个动作,我会收到“主线程阻塞”(如死锁)发送来自客户端的请求,而等待“逻辑模仿” 我可以如何防止它? 已经尝试过:

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

为什么你想要线程睡觉呢? – 2015-02-11 14:05:30

+0

因为我会'等待'来自外部的另一个结果。 – 2015-02-11 14:21:54

+0

只是为了澄清 - 你真的想完成什么?你只是想让客户“开火并忘记”?你想确保ASP.Net线程池中的线程可用于请求(而不是长时间运行的任务)吗? – 2015-02-11 16:45:03

回答

1

MVC默认块平行会议,并且只有一种方式,以避免它:

[SessionState(SessionStateBehavior.ReadOnly)] 

AttributeController,并明确使用读写分离的会话的逻辑。

1

这个问题是由我的同事发布的。是的,我们有这样的情况:我们需要“开火并忘记”(我们正在尝试异步调用动作,同时执行不同的动作,但我们仍然设法得到的是一个接一个地调用动作)

+0

如果你想客户端只是提出请求,而不是担心有意义的回应,我会建议看看[这个问题](http://stackoverflow.com/questions/6374860/fire-and-forget-with-asp-净MVC)。简而言之 - 不用担心异步控制器。处理请求的线程将创建一个新的Task(或Thread)并立即返回。这个新的任务或线程是关于它的业务。缺点是你不知道,除非你将它存储在某个地方,这是长期逻辑的结果。 – 2015-02-11 17:50:48

+0

如果我理解正确,案例是在会话中,MVC禁止使用并行会话,并且没有属性(SessionState.ReadOnly),并且在没有返回空结果的情况下需要可用的接收结果 – 2015-02-12 07:29:29

+0

不解决这个问题。 – 2015-02-12 07:32:53