2015-02-11 123 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