2016-03-15 88 views
4

我創建了一個使用Web服務(不屬於我們的組織)的剃鬚刀視圖。服務呼叫的方式如下:異步請求多次相同的Web服務

  1. 調用第一個方法,該方法返回一些guid。
  2. 對於這些指令中的每個,請異步調用第二個服務以返回記錄。

我必須使服務方法調用異步進行性能。我遇到的問題是,我目前無法等到所有響應可用,然後再將記錄返回到視圖。我走了這麼遠:

方法記錄返回Razor視圖:

public List<ProactisContract> GetContractsList() 
    { 
     List<Guid> contractIds = GetAmendedContracts(); 
     GetContractDetails(contractIds); 

     //Test 
     System.Threading.Thread.Sleep(5000); 

     return _contractList; 
    } 

這是通過第一次調用的GUID循環,使每個記錄的服務請求的第二種方法:

private void GetContractDetails(List<Guid> contractIds) 
    { 
     foreach (var recId in contractIds) 
     { 
      var request = new GetContractDetailsRequest { Authentication = _authorisation, ContractGuid = recId, ContractNumber = "string", SummaryOnly = true }; 

      AsyncCallback asyncCallback = GetContractDetailsCallBack; 

      _service.BeginGetContractDetails(request, asyncCallback, _service); 
     } 
    } 

    private void GetContractDetailsCallBack(IAsyncResult asyncResult) 
    { 
     var response = _service.EndGetContractDetails(asyncResult); 

     lock (_contractList) 
     { 
      var contract = new ProactisContract 
      { 
       /*Assign property values*/ 
      }; 
      _contractList.Add(contract); 
     } 
    } 

我如何能等待,直到所有響應任何想法返回列表<>回Razor視圖之前接收?

感謝

+0

我認爲這可能是一個重複的問題,你看過:http://stackoverflow.com/questions/12337671/using-async-await-for-multiple-tasks – Willwsharp

+0

我沒有。感謝您的建議。雖然這不是重複的IMO,因爲我的方法不返回任務,所以我沒有任何可以處理的事情。 – JimmyB

+0

啊,我沒有看到,我的道歉。 – Willwsharp

回答

1

您可以創建一個全局計數器變量則每次等於contractIds的長度和回調結束,你減1計數器,然後你做一個

while (counter != 0) 
{ 
} 

,你正在睡覺的線程。

絕對不是一個優雅的解決方案,但我認爲它會奏效。我相信這裏有人會提供更好的解決方案,但在此期間,我應該解決您的問題。

+0

謝謝你的工作。 – JimmyB

+0

沒問題,很高興我能幫到你! – Willwsharp