2016-03-15 47 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