将 MVC3 与异步任务结合使用以更新 UI

本文关键字:更新 UI 结合 MVC3 异步 任务 | 更新日期: 2023-09-27 18:33:52

我拥有的是视图上的AJAX表单,用于调用服务器。 此调用执行 n 个任务,其中 n 是由数据库中的记录决定的数字(通常不超过 10 条记录)。 每条记录对应于 TFS 中的一个生成定义,因此我尝试做的是获取所有这些生成定义,将它们排在 TFS 中,并在每次生成完成时更新 UI,以便用户知道哪些生成已完成。

不幸的是,我不确定如何最好地做到这一点。 我在想一些类似的事情:

        foreach (var dep in builds)
        {
            TFS tfsServer = new TFS(TFS_SERVER_ADDRESS);
            IBuildServer buildServer;
            int id = tfsServer.QueuBuild(dep.TeamProject, dep.BuildDefinition);
            string teamProject = dep.TeamProject;
            Task.Factory.StartNew(() => GetBuildStatus(teamProject, id, tfsServer));
        }

调用的任务是:

        private void GetBuildStatus(string TeamProject, int BuildID, TFS Server)
        {
            Server.GetBuildStatus(TeamProject, BuildID);
            AsyncManager.OutstandingOperations.Decrement();
        }

这里的问题是,在所有构建完成之前,不会调用我的 Done 方法。 如何一次将数据反馈到 UI?

还值得一提的是,GetBuildStatus 方法如下所示:

        do
        {
            var build = buildsView.QueuedBuilds.FirstOrDefault(x => x.Id == BuildID);
            if(build != null)
            {
                status = build.Status;
                detail = build.Build;    
            }
        } while (status != QueueStatus.Completed);
        return detail.Status.ToString();

将 MVC3 与异步任务结合使用以更新 UI

鉴于构建的持续时间将长于 HTTP 请求的超时,您不能在发生这种情况时让浏览器等待。 您需要返回一个页面,然后使用 AJAX 轮询该页面的更新。 通常,javascript 中会有一个计时器,它会触发对服务器的常规回调以获取更新的状态信息。

但是,由于您使用的是.NET,因此您也可以考虑尝试SignalR,它允许您使用长轮询,服务器发送的事件或Web套接字来等待来自服务器的更新,并且它将所有这些内容包装在一些易于实现的.NET类和Javascript中。