2014-04-08 43 views
1

我使用TPL發送電子郵件給最終用戶而不延遲api響應,我不知道應該使用哪種方法,因爲我在這裏處理數據庫上下文。我做了方法2,因爲我不確定在任務運行時數據庫上下文是否可用,所以創建了一個新的EF對象,或者即使這樣做都是錯誤的。任務並行庫和數據庫上下文

public class OrdersController : ApiController { 

    private AllegroDMContainer db = new AllegroDMContainer(); 

    public HttpResponseMessage PostOrder(Order order) { 

     // Creating a new EF object and adding it to the database 
     Models.Order _order = new Models.Order{ Name = order.Name }; 
     db.Orders.Add(_order); 

     /* Method 1 */ 
     Task.Factory.StartNew(() => { 
      _order.SendEmail(); 
     }); 

     /* Method 2 */ 
     Task.Factory.StartNew(() => { 
      Models.Order rOrder = db.Orders.Find(_order.ID); 
      rOrder.SendEmail(); 
     }); 

     return Request.CreateResponse(HttpStatusCode.Created); 

    } 


} 

回答

1

這兩種方法都是錯誤的,因爲您正在ASP.NET進程中的池線程上開始一個「即忘即斷」操作。

問題是,ASP.NET主機不保證在處理HTTP響應之間保持活動狀態。例如,它可以自動回收,手動重新啓動或從農場取出。在這種情況下,發送郵件操作永遠不會完成,您不會收到通知。

如果您需要加快響應傳遞速度,請考慮將發送郵件操作外包給單獨的WCF或Web API服務。一個相關的問題:Fire and forget async method in asp.net mvc