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 メソッドが呼び出されないことです。一度に 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();
4

1 に答える 1

1

ビルドの期間が HTTP 要求のタイムアウトよりも長くなることを考えると、これが発生している間、ブラウザーを待機させておくことはできません。ページを返し、AJAX を使用してそのページからの更新をポーリングする必要があります。通常、更新されたステータス情報を取得するためにサーバーへの定期的なコールバックをトリガーする JavaScript のタイマーがあります。

ただし、.NET を使用しているため、ロング ポーリング、サーバー送信イベント、または Web ソケットを使用してサーバーからの更新を待機できるSignalRを試すことも検討できます。これにより、簡単に実装できる .NET クラスと Javascript ですべてがラップされます。 .

于 2012-05-10T21:23:32.270 に答える