我使用TPL向最终用户发送电子邮件而不延迟api响应,我不确定应该使用哪种方法,因为我在这里处理数据库上下文。我做了方法2,因为我不确定在任务开始运行时db上下文是否可用,所以创建了一个新的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);
}
}
答案 0 :(得分:1)
这两种方法都是错误的,因为您在ASP.NET进程内的池线程上启动了“即发即弃”操作。
问题是,ASP.NET主机无法保证在处理HTTP响应之间保持活跃状态。例如,它可以自动回收,手动重启或从农场带出。在这种情况下,发送邮件操作永远不会完成,您也不会收到通知。
如果您需要加快响应传递速度,请考虑将send-mail操作外包给单独的WCF或Web API服务。相关问题:Fire and forget async method in asp.net mvc。