【问题标题】:Requesting same web service multiple times asynchronously异步多次请求同一个 Web 服务
【发布时间】:2016-03-15 14:35:25
【问题描述】:

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

  1. 调用第一个方法,该方法返回多个 guid。
  2. 对于这些 guid 中的每一个,异步调用第二个服务以返回记录。

为了提高性能,我必须异步调用服务方法。我遇到的问题是,在将记录返回到视图之前,我目前无法等到 ALL 响应可用。我已经走到这一步了:

返回记录到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);
        }
    }

关于如何等待直到收到所有回复后再将 List 返回剃刀视图的任何想法?

谢谢

【问题讨论】:

  • 我认为这可能是一个重复的问题,你看过了吗:stackoverflow.com/questions/12337671/…
  • 我没有。谢谢你的建议。虽然这不是重复的 IMO,因为我的方法不返回任务,因此我没有什么可处理的。
  • 啊,我没看到,抱歉。
  • 我已经在下面发布了一个答案,如果可以的话请告诉我。

标签: c# web-services asynchronous soap


【解决方案1】:

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

while (counter != 0)
{
}

你在哪里睡觉。

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

【讨论】:

  • 没问题,很高兴我能帮上忙!
猜你喜欢
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
相关资源
最近更新 更多