2011-08-08 61 views
1

在ASP.NET MVC中,當您使用已完成的操作創建異步操作時,它會自動異步處理嗎?是否是自動異步的Asp MVC異步控制器操作?

例子:

如果我有沒有聲明的委託並異步無效在後臺線程自動運行一個長期運行的任務?

public void NewsAsync(string city) { 

    AsyncManager.OutstandingOperations.Increment(); 
    NewsService newsService = new NewsService(); 
    AsyncManager.Parameters["headlines"] = newsService.GetHeadlines; 
    AsyncManager.OutstandingOperations.Decrement(); 
} 

還是隻有當長時間運行的任務是異步任務時纔會這樣做?

public void NewsAsync(string city) { 

    AsyncManager.OutstandingOperations.Increment(); 
    NewsService newsService = new NewsService(); 
    newsService.GetHeadlinesCompleted += (sender, e) => 
    { 
     AsyncManager.Parameters["headlines"] = e.Value; 
     AsyncManager.OutstandingOperations.Decrement(); 
    }; 
    newsService.GetHeadlinesAsync(city); 
} 

所以換句話說,我不介意的空洞內的方法是異步,但我不關心,如果它的自我虛空是異步,以便騰出IIS線程。

回答

1

你的第一個代碼示例沒有意義。 NewsAsync必須儘可能快地返回並將工作委託給某個後臺線程。這是NewsCompleted行動,將結果傳遞到視圖中,如第二個示例中所示。

就這些後臺線程而言,它將取決於如何實現此NewsService.GetHeadlinesCompleted方法。異步控制器最好的情況是有一些長時間運行的I/O操作(例如Web服務調用,數據庫查詢等),可以使用I/O Completion Ports運行。在這種情況下,執行請求期間沒有線程被壟斷。在其他情況下,例如嘗試異步執行同步操作(在我看來,您在第一個代碼示例中嘗試了這種操作),異步控制器的好處是非常令人懷疑的,甚至會讓事情變得更糟。

爲了更深入地瞭解ASP.NET中的異步操作,我會向您推薦following article on MSDN。它討論了異步頁面,但是完全相同的概念適用於ASP.NET異步控制器,因爲它們在內部實現爲異步處理程序(使用接口IHttpAsyncHandler)。