在我的ASP.NET MVC Web應用程序中,我正在使用一個有時可能需要很長時間才能響應的Web服務。在這種情況下,用戶可能想要取消請求並能夠提出其他請求。但是,由於服務器仍在忙於處理先前的請求,用戶必須等到該請求完成。出於這個原因,我決定做一些執行密集IO作業異步的操作方法,希望主線程不會被阻塞。但是這並沒有幫助。這是我的方法:請求可以在單獨的線程上處理嗎?
1:public class TestController:AsyncController{
2: public async Task<ActionResult> GetString(){
3:
4: string data=await Task<string>.Factory.StartNew(()=>{
5: return service.GetDataAsString("name");
6: });
7: return View(data);
8: }
9:}
第7行將不會執行,除非服務返回期望的字符串,所以仍然阻塞仍然存在。我需要做什麼才能使整個行動在單獨的線程中進行?我必須走舊時尚嗎?這種事情不是異步方法嗎?
可能是你看錯了方向。什麼可能會導致你的問題,會話鎖。嘗試禁用它,裝飾控制器的下一個屬性:[SessionState(SessionStateBehavior.Disabled)] – Uriil
這顯然會禁用會議狀態,這不是我想要的。如果這是唯一的方法,那麼這意味着我必須犧牲兩者之一:會話或用戶體驗。我對麼? –
@MikeJM - 我想你以後是火與忘記。或者,您可以將您的操作分爲兩個操作(一個返回視圖,另一個執行服務調用)並從客戶端執行兩個單獨的請求。 – heymega