异步方法的返回值

问题描述 投票:0回答:1
我有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
)被调用时,它不会等待其他操作完成,而是执行完毕并返回。现在有一个 
webservice
,它仅在事件 
getResult
(在本例中)发生时被调用,事件 
getResult
(在本例中)的调用基于网络,服务器响应,这将有一点延迟,我们无法控制。所以直到那时 
GetCityForecastByZIPAsync
 方法完成执行。一段时间后,当 
getResult
 事件发生时,它会执行但不会返回到调用方法即。 
checkTemp
方法。 

那么我如何从

getResult

 事件获取数据并将其放回 
checkTemp
 方法,以便我可以将其用于我的目的。

如果有人知道请帮帮我。

c# web-services async-await
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.