C# 使用MVC3和异步任务更新UI

C# 使用MVC3和异步任务更新UI,c#,ajax,asp.net-mvc-3,task-parallel-library,C#,Ajax,Asp.net Mvc 3,Task Parallel Library,我拥有的是一个视图上的AJAX表单,它可以调用服务器。此调用执行n个任务,其中n是由数据库中的记录决定的数字(通常不超过10条记录)。每个记录对应于TFS中的一个构建定义,因此我尝试获取所有这些构建定义,在TFS中对它们进行排队,并在每个构建完成时更新UI,以便用户知道哪些构建已经完成 不幸的是,我不知道如何最好地做到这一点。我是这样想的: foreach (var dep in builds) { TFS tfsServer = new

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

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

但是,既然您正在使用.NET,您也可以考虑尝试使用长轮询、服务器发送事件或Web套接字等待服务器更新,并在一些易于实现的.NET类和JavaScript中封装它。