从async方法返回值

本文关键字:返回值 方法 async | 更新日期: 2023-09-27 18:28:09

我有asmx Web服务,我正在PCL中使用它,所以我们都知道,现在PCL不再支持asmx网络服务,而是支持wcf网络服务。我设法通过PCL使用silverlight插件调用了asmx Web服务。但它创建了异步方法并将WSDL转换为wcf。

现在的问题是,我需要从现在是异步方法的web方法返回一些值。如果有人知道解决方案,请帮助我。

我正在使用以下代码,

public class PerformLogIn
{
     string temp;
     public string checkTemp(string code)
     {
         ServiceReference1.WeatherSoapClient obj = new ServiceReference1.WeatherSoapClient(
                                    new BasicHttpBinding(),
                                    new EndpointAddress("http://wsf.cdyne.com/WeatherWS/Weather.asmx"));
         obj.GetCityForecastByZIPCompleted+=getResult;
         obj.GetCityForecastByZIPAsync(code);
         return temp;
     }
     void getResult(Object sender,GetCityForecastByZIPCompletedEventArgs e)
     {
         string error = null;
         if (e.Error != null)
             error = e.Error.Message;
         else if (e.Cancelled)
             error = "cancelled";
         var result = e.Result; 
         temp=result.temprature;
     }

}

所以当我运行它时,temp的值为null。当我调试它时,我发现当getResult出现时,它进入void getResult,此时它已经到达return语句。

这里的问题是,当GetCityForecastByZIPAsync方法(即async)被调用时,它不等待其他人的操作完成,它只是完成执行并返回。现在有一个webservice,它只在事件getResult发生时被调用(在这种情况下),事件getResult的调用(在这个情况下)是基于网络的,服务器响应会有一点我们无法控制的延迟。因此,直到GetCityForecastByZIPAsync方法完成执行为止。当getResult事件发生一段时间后,它执行但不返回调用方法,即checkTemp方法。

那么,我如何从getResult事件中获取数据,并将其放回checkTemp方法中,以便将其用于我的目的呢。

如果有人知道,请帮帮我。

从async方法返回值

仅供参考:你的问题的整个第一段对大多数听众来说都是官样文章,似乎与问题无关(或者至少,如果你以更广泛理解的方式提供了实际的重要细节,那么就不相关了)。

就问题而言…

代码中最明显的两个问题是:a)在启动异步操作之后订阅getResult事件处理程序,这意味着操作可以在设置为收到完成通知之前完成;b)checkTemp方法在返回结果之前没有等待完成。

第一个问题很容易解决。只需颠倒两个语句的顺序,使它们看起来像这样:

     obj.GetCityForecastByZIPCompleted += getResult;
     obj.GetCityForecastByZIPAsync(code);

修复第二部分很难评论,主要是因为你在问题中没有提供足够的上下文。如果GetCityForecastByZIPAsync方法实际上是一个C#async方法,那么最好的方法是完全去掉getResult方法(以及将其订阅到...Completed事件),并将await调用为GetCityForecastByZIPAsync。否则,最好的方法是checkTemp不实际返回值,而是将该方法设置为void,并让getResult方法处理操作完成时实际需要发生的任何事情(例如,通过调用在UI中显示结果的代码)。

如果没有更多的上下文,这是不可能的。看见https://stackoverflow.com/help/mcve获取有关如何发布更好问题的信息。