将 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();
鉴于构建的持续时间将长于 HTTP 请求的超时,您不能在发生这种情况时让浏览器等待。 您需要返回一个页面,然后使用 AJAX 轮询该页面的更新。 通常,javascript 中会有一个计时器,它会触发对服务器的常规回调以获取更新的状态信息。
但是,由于您使用的是.NET,因此您也可以考虑尝试SignalR,它允许您使用长轮询,服务器发送的事件或Web套接字来等待来自服务器的更新,并且它将所有这些内容包装在一些易于实现的.NET类和Javascript中。