我有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
方法,以便我可以将其用于我的目的。
如果有人知道,请帮助我。
答案 0 :(得分:0)
仅供参考:您的问题的整个第一段对您的大多数观众来说都非常糟糕,并且似乎与问题无关(或者至少,如果您提供了实际的重要细节,则不相关更广泛可理解的方式)。
就问题而言......
代码中最明显的两个问题是: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。