我所拥有的是一个调用服务器的View上的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();
答案 0 :(得分:1)
鉴于构建的持续时间将长于HTTP请求的超时,您无法在发生这种情况时让浏览器等待。您需要返回一个页面,然后使用AJAX从该页面轮询更新。通常,您在javascript中有一个计时器,它会触发定期回调服务器以获取更新的状态信息。
但是,既然你使用的是.NET,你也可以考虑尝试SignalR,它可以让你使用长轮询,服务器发送事件或网络套接字来等待来自服务器的更新,并将它全部包装起来实现.NET类和Javascript。