异步请求多次同一Web服务

时间:2016-03-15 14:35:26

标签: c# web-services asynchronous soap

我正在创建一个使用Web服务(不属于我们组织)的剃刀视图。服务调用的方式如下:

  1. 调用第一个方法,该方法返回一些guid。
  2. 对于每个这些guid,请异步调用第二个服务以返回记录。
  3. 为了提高性能,我必须异步调用服务方法。我遇到的问题是,在将记录返回到视图之前,我目前无法等待 ALL 响应可用。我到目前为止:

    将记录返回到剃刀视图的方法:

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

    有关如何等待的任何想法,直到收到所有回复,然后再返回列表&lt;&gt;回到剃刀观点?

    由于

1 个答案:

答案 0 :(得分:1)

您可以创建一个等于contractIds长度的全局计数器变量,然后每次回调结束时,将计数器减1,然后执行

while (counter != 0)
{
}

你在哪里睡觉。

绝对不是一个优雅的解决方案,但我认为它会起作用。我相信这里的其他人会提供更好的解决方案,但在此期间,我的应该解决你的问题。