C# 任务并行库与数据库上下文

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

我正在使用TPL向最终用户发送电子邮件,而不会延迟api响应,我不确定应该使用哪种方法,因为我在这里处理db上下文。我之所以使用方法2,是因为我不确定在任务运行时db上下文是否可用,所以a创建了一个新的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);

    }


}

这两种方法都是错误的,因为您在ASP.NET进程内的池线程上启动了fire-and-forget操作

问题是,不能保证ASP.NET主机在处理HTTP响应之间保持活动状态。例如,它可以自动回收、手动重新启动或带出农场。在这种情况下,发送邮件操作将永远不会完成,您也不会得到通知

如果您需要加快响应传递,请考虑将发送邮件操作外包到单独的WCF或Web API服务。相关问题: