从异步方法返回值

时间:2014-10-28 10:44:42

标签: c# web-services async-await

我有asmx webservice,我在PCL中使用它,所以我们都知道现在PCL不再支持asmx webservice,它支持wcf webservices。我以某种方式设法通过使用silverlight插件通过PCL调用asmx webservice。但它创建了异步方法并将WSDL转换为wcf。

现在问题是我需要从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的值为空。当我调试它时,我发现当getResult发生时,它会在到达void getResult语句时进入return

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

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

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

1 个答案:

答案 0 :(得分:0)

仅供参考:您的问题的整个第一段对您的大多数观众来说都非常糟糕,并且似乎与问题无关(或者至少,如果您提供了实际的重要细节,则不相关更广泛可理解的方式)。

就问题而言......

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

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

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

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

没有更多的背景,就不可能说。有关如何发布更好问题的信息,请参阅https://stackoverflow.com/help/mcve