私が持っているのは、サーバーを呼び出すビュー上の 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 メソッドが呼び出されないことです。一度に 1 つずつ 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();