在ASP.net MVC中异步调用种子方法

时间:2014-06-13 22:09:06

标签: c# asp.net-mvc entity-framework asynchronous

我希望这个问题不是太广泛,但在使用实体框架时我遇到了设计问题。

基本上我的公司希望我们的应用程序能够手动上传有效数据库并随意播种,而不必运行更新数据库。通过简单地将种子方法移出配置文件并重载构造函数以从上传的路径接受数据库,我就可以轻松地完成这方面的工作。

然而,被问到我的下一个任务让我遇到了一些设计问题。他们希望我通过进度条/文本输出在客户端提供此播种正在发生的指示,也许还有多远。由于播种方法同步运行,这已经证明很麻烦,因为客户端将在运行期间被锁定。

由于播种方法需要大约20分钟才能完成,这并不理想,因为客户不确定他们需要等多久才能再做一次。我尝试使用异步控制器实现它,但它抱怨播种方法的类型为void。在文件上传中调用的动作结果看起来像这样

    [HttpPost]
    public ActionResult Index(HttpPostedFileBase file)
    {

        if (file.ContentLength > 0)
        {
            var fileName = Path.GetFileName(file.FileName);
            string date = DateTime.Now.ToString("MM-dd-yyyy-HHmm-");
            fileName = date + fileName;
            var path = Path.Combine(Server.MapPath("~/bin/SampleData"), fileName);
            file.SaveAs(path);
            //create config instance and seed path
            Reseed reseed = new Reseed(fileName);
            reseed.Seed(db);
            GetTimeStamp(DateTime.Now);
        }

        return RedirectToAction("Index");
    }

有谁知道是否有一种很好的方式来设计它可以异步运行?

1 个答案:

答案 0 :(得分:0)

在服务器上异步播种只会在进程持续时间内释放一个线程(如果它是IO绑定的),为了返回,你最终还是会等待这个完成(如果你是使控制器异步)。 它不是并行化的良好候选者,因为它不是计算绑定操作。

无论哪种方式,您都希望获得进步回到客户端,因此有一些方法和技术值得考虑:

使用SignalR的Web套接字,您可以从服务器到客户端建立连接,并将连接上的内容推送到客户端。这降级为软件不支持它的长轮询。它的双向可能有点矫枉过正。

服务器发送事件,其开销小于Web套接字,并且从服务器到客户端是半双工的,它允许将内容从服务器推送到客户端

稍微不同的方法是从屏幕返回/重定向并向用户发送电子邮件,指示进程何时完成。您可以启动计划任务,或者将命令发送到进程外的某些操作以启动批处理。