【问题标题】:Call webservice asynchronously异步调用webservice
【发布时间】:2017-04-01 03:23:35
【问题描述】:

我需要调用 Web 服务,因此我将 Web 服务添加为 Web 参考,并且可以调用它。现在我需要使该调用异步,因为它需要下载大量数据并且需要大量时间。我尝试使用 async/await 方法,但我不能这样做,因为 web 服务中的方法不是异步的。

原码:

 public static void validateLogin(JsonParameters _param, ref ValidateCredentials result, ref string excep_error)
    {
        var _mobileService = new MobileService();
        _mobileService.Url = AppParam.IISSTRING + "/UrlAddressReference";
        try
        {
            result = _mobileService.downloaddata(_param);
        }
        catch (Exception ex)
        {
            excep_error = ex.Message;
        }

    }

我尝试添加异步任务来代替 void 以使方法异步,但是如何等待 Web 服务响应?

在我将 Web 服务添加为 Web 引用后,我可以看到它为其中的每个方法创建了一个异步方法和完成的事件。我该如何使用它们? (例如:downloaddata", a method namedownloaddataasync`,以及事件“downloaddatacompleted”)

有没有办法做到这一点,还是我需要更改网络服务?

【问题讨论】:

  • MobileService.downloaddata 调用的实现是什么样的,因为这很可能需要从那里开始。

标签: android web-services asynchronous xamarin async-await


【解决方案1】:

在我将 Web 服务添加为 Web 引用后,我可以看到它为其中的每个方法创建了一个异步方法和完成的事件。我该如何使用它们?

这些是EAP 成员。你需要write TAP wrappers for those EAP members;然后你可以像平常一样使用async/await

【讨论】:

    【解决方案2】:
    public async static Task validateLogin(JsonParameters _param, ref ValidateCredentials result, ref string excep_error)
            {
              await Task.Run(()=>
              {
                var _mobileService = new MobileService();
                _mobileService.Url = AppParam.IISSTRING + "/UrlAddressReference";
                try
                {
                    result = _mobileService.downloaddata(_param);
                }
                catch (Exception ex)
                {
                    excep_error = ex.Message;
                }
             });
    }
    

    【讨论】:

    • 我也想知道
    【解决方案3】:

    如果你想使用async/await,正确的做法是你建议的:将validateLogin改为public static async Task validateLoginAsync(...)调用validateLogin的方法需要改变,调用它的方法等等。

    您可以使用AsyncContextNotifyTaskCompletion 作为拐杖(来自https://github.com/StephenCleary/AsyncEx/wiki/AsyncContext),但您仍然可能需要使用BackgroundWorker 或类似的构造。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多