0

我拥有的是一个视图上的 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();
        }

这里的问题是,在所有构建完成之前,我的 Completed 方法不会被调用。我将如何一次将数据反馈给 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();
4

1 回答 1

1

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

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

于 2012-05-10T21:23:32.270 回答