2014-10-28 162 views
0

我有asmx webservice,我在PCL中使用它,所以我們都知道現在PCL不再支持asmx webservice,它支持wcf webservices。我以某種方式設法通過使用silverlight插件通過PCL調用asmx webservice。但它創建異步方法並將WSDL轉換爲wcf。異步返回值方法

現在的問題是我需要從webmethods返回一些現在是異步方法的值。如果有人知道這個解決方案,請幫助我。

我使用下面的代碼,

​​

}

所以,當我運行它的temp值爲null。當我調試它時,我發現當getResult發生時,它到達void getResult那時它已達到return聲明。

這裏的問題是,GetCityForecastByZIPAsync方法被調用時,它不會等待別人的操作完成,它只是完成它的執行並返回。現在有一個webservice僅在發生事件getResult(在這種情況下)時才被調用,事件getResult(在本例中)的調用基於網絡,服務器響應將會有一點我們無法控制的延遲。因此,直到那個時候GetCityForecastByZIPAsync方法完成其執行。並且在發生getResult事件後的一段時間,它會執行,但不會返回到調用方法即viz。 checkTemp方法。

那麼如何從getResult事件中獲取數據,並將其返回到checkTemp方法,以便我可以將其用於我的目的。

如果有人知道,請幫助我。

+0

如果不知道'sampleSoapClient'的公共API,我們無法真正幫助您。但是,乍看起來,它看起來像是在將基於事件的異步與基於任務的異步混合在一起,而您並不等待'AuthenticateUserLoginAsync'完成。 – dcastro 2014-10-28 11:11:09

+0

@dcastro:由於某種原因,我無法放入'sampleSoapClient'。但我已經把另一個例子的行爲完全一樣。所以請按照上面的代碼幫助我。 – Rohit 2014-10-28 11:18:22

回答

0

僅供參考:您的問題的整個第一段對於您的大多數觀衆來說都非常吸引人,並且與問題似乎不相關(或者至少,如果您提供了實際重要細節更廣泛的理解方式)。

就問題來說...... hellip;

兩個與您的代碼最明顯的問題是,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

+0

Thanx爲您的答案。我試圖添加更多的上下文。如果您知道解決方案,請檢查並通知我。 – Rohit 2014-10-29 03:54:03

+0

我沒有找到所有有用的附加說明。真正需要的是'WeatherSoapClient'及其'GetCityForecastByZIPAsync()'方法的明確說明文檔。也就是說,假設你添加的是真的,並且該方法是一個真正的'async'方法,那麼請閱讀我在原始答案中寫的內容:「如果GetCityForecastByZIPAsync方法實際上是一種C#異步方法,那麼最好的方法是擺脫的getResult方法(以及將其訂閱到... Completed事件),並等待GetCityForecastByZIPAsync的調用。 – 2014-10-29 03:59:32

+0

通過使用'SlSvcUtil'插件,我生成了http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL到WC​​F服務的WSDL。可能你可以看看它。感謝名單。 – Rohit 2014-10-29 05:00:12