现在的问题是我需要从 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
方法,以便我可以将其用于我的目的。如果有人知道请帮帮我。
就问题而言……
代码中两个最明显的问题是: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。