Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.net MVC中异步调用种子设定方法_C#_Asp.net Mvc_Entity Framework_Asynchronous - Fatal编程技术网

C# 在ASP.net MVC中异步调用种子设定方法

C# 在ASP.net MVC中异步调用种子设定方法,c#,asp.net-mvc,entity-framework,asynchronous,C#,Asp.net Mvc,Entity Framework,Asynchronous,我希望这个问题不要太宽泛,但在使用实体框架时,我在设计中遇到了一个问题 基本上,我的公司希望我们的应用程序能够手动上传有效的数据库,并随意为它们设定种子,而不必运行更新数据库来实现这一点。通过简单地将种子方法移出配置文件并重载构造函数以从上传的路径接受数据库,我就可以很容易地实现这一点 然而,要求我完成的下一项任务使我遇到了一些设计问题。他们希望我通过一个进度条/文本输出,在客户端提供一个指示器,表明正在进行这种播种,可能还有播种的距离。由于种子设定方法是同步运行的,这证明很麻烦,因为客户端将在

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

基本上,我的公司希望我们的应用程序能够手动上传有效的数据库,并随意为它们设定种子,而不必运行更新数据库来实现这一点。通过简单地将种子方法移出配置文件并重载构造函数以从上传的路径接受数据库,我就可以很容易地实现这一点

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

由于播种方法需要大约20分钟才能完成,这并不理想,因为客户可能无法确定他们需要等待多长时间才能再次执行某项操作。我试图使用异步控制器实现它,但它抱怨种子方法的类型是void。文件上传时调用的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 sockets,使用SignalR,您可以通过它建立从服务器到客户端的连接,并将连接上的内容推送到客户端。这将降级为长轮询,而软件不支持它。由于其双向性,可能有点过分

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

另一种稍有不同的方法是从屏幕返回/重定向,并向用户发送电子邮件,指示流程何时完成。您可以启动计划任务,或向进程外的某个对象发送命令以启动批处理流程