Web Services 返回值从candric方法

lymgl2op  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(168)

我有asmx webservice,我在PCL中使用它,所以我们都知道现在PCL不再支持asmx webservice,它支持wcf webservices。我设法通过使用silverlight插件通过PCL调用asmx webservice。但是它创建了一个translac方法,并将WSDL转换为wcf。
现在的问题是,我需要从webmethods中返回一些值,这些值现在是webmethods中的值。如果有人知道这个问题的解决方案,请帮助我。
我使用以下代码,

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)被调用时,它不会等待其他操作完成,它只是完成执行并返回。(在本例中),调用事件getResult(在这种情况下)是基于网络的,服务器响应,这将有一点延迟,我们无法控制。所以直到那个时候GetCityForecastByZIPAsync方法完成其执行。一段时间后,当getResult事件发生,它执行但不返回到调用方法,即checkTemp方法。
那么我如何从getResult事件中获取数据并将其放回checkTemp方法,以便我可以将其用于我的目的。
如果有人知道,请帮帮我。

lp0sw83n

lp0sw83n1#

代码中最明显的两个问题是:a)在启动异步操作 * 之后 * 才订阅getResult事件处理程序,这意味着操作可能在设置为收到完成通知之前完成,b)checkTemp方法在返回结果之前没有等待完成。
第一个问题很容易解决。只需颠倒这两个语句的顺序,使它们看起来像这样:

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

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

相关问题