任务并行库和DB上下文

时间:2014-04-08 23:55:11

标签: c# entity-framework task-parallel-library

我使用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);

    }


}

1 个答案:

答案 0 :(得分:1)

这两种方法都是错误的,因为您在ASP.NET进程内的池线程上启动了“即发即弃”操作。

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

如果您需要加快响应传递速度,请考虑将send-mail操作外包给单独的WCF或Web API服务。相关问题:Fire and forget async method in asp.net mvc