2012-05-10 80 views
0

我所擁有的是在調用服務器的視圖上的AJAX表單。此調用執行n個任務,其中n是由數據庫中的記錄決定的數字(通常不超過10條記錄)。每個記錄對應於TFS中的構建定義,因此我想要做的是獲取所有這些構建定義,將它們排隊在TFS中,並且每個構建完成後更新UI,以便用戶知道哪些構建已完成。使用MVC3與異步任務來更新用戶界面

不幸的是我不確定如何做到最好。我正沿着這些路線思考的東西:

 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(); 
     } 

這裏的問題是,我已完成的方法是不會被調用,直到所有的構建具有完成。我會如何一次將數據反饋給用戶界面?

還值得一提的是,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(); 

回答

1

鑑於構建的持續時間將長於超時的HTTP請求,你不能離開瀏覽器等,而出現這種情況。您需要返回一個頁面,然後使用AJAX從該頁面輪詢更新。通常情況下,您需要在JavaScript中使用計時器來觸發定期回調服務器以獲取更新的狀態信息。

但是,由於您使用的是.NET,因此您可以考慮嘗試SignalR,它允許您使用長輪詢,服務器發送的事件或Web套接字等待來自服務器的更新,並將其全部包裝在一些易於實現的內容中。 NET類和Javascript。