2013-04-29 77 views
4

我變爲Asp MVC 3個工作,並在我的應用程序創建異步控制器,像一些方法:天冬氨酸MVC和網絡API異步控制器

public void ActionAsync() 
{ 
    AsyncManager.OutstandingOperations.Increment(); 
    AsyncManager.Parameters["someResult"] = GetSomeResult(); 
    AsyncManager.OutstandingOperations.Decrement(); 
} 

public JsonResult ActionCompleted(SometResultModel someResult) 
{ 
    return Json(someResult, JsonRequestBehavior.AllowGet); 
} 

而現在,當我與MVC4和網絡工作API,我需要像MVC 3,在當前的時間它的創建與異步操作控制器的樣子:

public Task<HttpResponseMessage> PostActionAsync() 
{ 
    return Task<HttpResponseMessage>.Factory.StartNew(() => 
      { 
       var result = GetSomeResult(); 
       return Request.CreateResponse(HttpStatusCode.Created, result); 
      }); 
} 

它是一個好主意,使在網頁API異步操作這樣或者有一些更好的方法是存在的?

UPD。另外,如果我將使用

public async Task<HttpResponseMessage> ActionAsync() 
{ 
    var result = await GetSomeResult(); 
    return Request.CreateResponse(HttpStatusCode.Created, result); 
} 

這個完整的動作將在後臺線程中工作嗎?以及如何使我的GetSomeResult()函數等待?這是Task<HttpResponseMessage>不等待的回報。

回答

2

與您在MVC 3中的原始操作有很大的區別,您在調用ActionAsync方法後基本釋放客戶端(客戶端線程被釋放,並且必須隨後調用ActionCompleted操作以獲取結果) 。如果這就是你要找的東西,你需要在客戶端實現具有任務的異步代碼。

你的第二個版本是使服務器代碼異步,但客戶端線程仍然會等待響應同步。等待GetResult將使服務器線程返回到ASP.NET線程池,直到GetResult方法返回一些內容,以便該線程可以與其他請求一起使用。它與後臺工作沒有任何關係。如果你想使用fire and forget方法,你需要使用Task.Factory.StartNew(()=>你的代碼)或ThreadPool.QueueUserWorkItem(()=>你的代碼)

+0

你能告訴我這是怎麼回事行動應該看起來像?我嘗試過使用這個http://pastebin.com/NeRKfqDp並且我所有的'POST'查詢都返回「404」 – 2013-04-29 14:49:13

+0

Factory.StartNew在這個上下文中肯定是錯誤的,因爲你正在旋轉一個額外的線程(或者調度一些額外的在線程池中工作)以及當前處理當前請求的線程。 EventModel.PrepareModel是否返回任務? – 2013-04-29 16:21:54

+0

'EventModel.PrepareModel'是一個void函數。所以,如果'Factory.StartNew'錯了,我應該用什麼來發出異步請求? – 2013-04-30 07:27:40