C# 任务并行库与数据库上下文
我正在使用TPL向最终用户发送电子邮件,而不会延迟api响应,我不确定应该使用哪种方法,因为我在这里处理db上下文。我之所以使用方法2,是因为我不确定在任务运行时db上下文是否可用,所以a创建了一个新的EF对象,或者可能我做得都不对C# 任务并行库与数据库上下文,c#,entity-framework,task-parallel-library,C#,Entity Framework,Task Parallel Library,我正在使用TPL向最终用户发送电子邮件,而不会延迟api响应,我不确定应该使用哪种方法,因为我在这里处理db上下文。我之所以使用方法2,是因为我不确定在任务运行时db上下文是否可用,所以a创建了一个新的EF对象,或者可能我做得都不对 public class OrdersController : ApiController { private AllegroDMContainer db = new AllegroDMContainer(); public HttpRespon
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);
}
}
这两种方法都是错误的,因为您在ASP.NET进程内的池线程上启动了fire-and-forget操作 问题是,不能保证ASP.NET主机在处理HTTP响应之间保持活动状态。例如,它可以自动回收、手动重新启动或带出农场。在这种情况下,发送邮件操作将永远不会完成,您也不会得到通知
如果您需要加快响应传递,请考虑将发送邮件操作外包到单独的WCF或Web API服务。相关问题: