繁体   English   中英

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

[英]Calling a seeding method asynchronously in ASP.net MVC

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

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

但是,下一个要求我完成的任务使我遇到了一些设计问题。 他们希望我通过进度条/文本输出在客户端提供此播种发生的指示器,以及播种的距离。 由于播种方法是同步运行的,因此这被证明很麻烦,因为客户端将在运行期间被锁定。

由于播种方法大约需要20分钟才能完成,因此这不是理想选择,因为客户端无法确定他们必须等待多长时间才能再次执行某项操作。 我尝试使用异步控制器来实现它,但是它抱怨种子方法的类型无效。 在文件上传中调用的actionresult看起来像这样

    [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");
    }

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

在服务器上以异步方式进行播种只会在进程持续时间内释放线程(如果绑定了IO),为了返回该线程,您将最终等待它完成(如果要使控制器成为该线程)异步)。 它也不适合并行化,因为它也不是计算绑定操作。

无论哪种方式,您都希望将进度反馈给客户端,因此有几种方法和技术值得考虑:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM