从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
方法中,以便将其用于我的目的呢。
如果有人知道,请帮帮我。
仅供参考:你的问题的整个第一段对大多数听众来说都是官样文章,似乎与问题无关(或者至少,如果你以更广泛理解的方式提供了实际的重要细节,那么就不相关了)。
就问题而言…
代码中最明显的两个问题是: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获取有关如何发布更好问题的信息。