异步调用webservice

时间:2016-11-17 14:23:41

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

我需要调用一个Web服务,所以我添加了webservice作为Web引用,我可以调用它。现在我需要将该调用设为异步,因为它需要下载大量数据并且需要花费大量时间。我试图使用async / await方法,但我不能这样做,因为webservice中的方法不是异步。

原始代码:

 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以使方法异步,但我如何等待webservice响应?

在我将webservice作为web引用添加后,我可以看到它为其中的每个方法创建了一个异步方法和已完成的事件。我该如何使用它们? (例如:downloaddata", a method name downloaddataasync`,以及#34; downloaddatacompleted")

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

3 个答案:

答案 0 :(得分:1)

  

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

这些是EAP个成员。你需要write TAP wrappers for those EAP members;那么您可以像往常一样使用async / await

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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