2013-01-04 64 views
0

朋友你好我有一個代碼如下:等待一個異步方法在WP7返回結果

for (int i = 1; i < 6; i++) 
{ 
    int j = 0; 
    Nos[j++] = Config[i]; 

    var xmladd = "uri to download data"; 
    WebClient _proxy2 = new WebClient(); 
    _proxy2.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DownloadStringCompleted); 
    _proxy2.DownloadStringAsync(new Uri(xmladd)); 

    string msg = Config[11] + ":" + Config[12] + " .My Current Location is " + Properties.address + " , Latitude : " + clslatlong.ReturnLat() + " , Longitude : " + clslatlong.ReturnLongi(); 
} 

這裏的問題是,完成事件不會immedietely解僱,繼續執行進一步的代碼,但我下一個代碼是基於已完成事件返回的結果,在這種情況下應該做什麼?我的代碼應該等待從完成的事件得到響應,然後繼續進行請幫助。

+0

我與戴維同意,異步應該是「射後不理」,如果你需要等待它繼續之前完成,你應該同時調用它。 – Kevin

+1

@Kevin除非你需要不阻塞當前的線程,這是一個非常常見的用例。 – Servy

+0

是啊同意,我知道,那麼我如何在wp7應用程序中同步調用代碼中提到的方法? – DharaPPatel

回答

2

如果取決於結果,您應該繼續在請求完成處理程序中執行代碼。這是事件驅動或異步編碼的工作原理。

+0

你沒有得到我的問題。在我完成的事件中,我設置了Properties.address ok,但是我會得到null值,因爲完成的事件不會觸發,而是繼續執行代碼。 – DharaPPatel

+0

看起來你在異步調用中出現了一些問題,如果你的結果是null或者你的完成處理程序沒有被調用,你試圖做出這樣的調整。無論如何,你不能(不應該)等待調用異步方法的結果。 –

+2

@DharaPPatel我想你會誤解'DownloadStringAsync()'(以及一般的異步調用)是如何工作的。它不下載數據,調用你的回調委託,然後返回。它所做的是立即返回,然後它(異步)下載數據並調用回調函數。 – svick

0
+0

這是否適用於WP7?如果可能,我不會推薦使用CTP(*預覽*),它有幾個已知的錯誤。 – svick

+1

是的,它也適用於WP7。 http://kevinashley.com/async-ctp-task-based-asynchronous-programming-for-windows-phone/ 另外,我想強調一下,微軟將構建未來產品的所有異步操作,例如win8 RTM基於異步的體系結構。 請閱讀以下閱讀材料: http://mnajder.blogspot.com/2011/01/async-ctp-on-wp7.html http://msdn.microsoft.com/en-us/library/vstudio/ hh191443。aspx –

+0

如果您不喜歡使用CTP,那麼您將始終對未來感到遲緩,始終在過時/過時的技術上構建您的基礎架構。 請閱讀以下閱讀材料: http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2012/05/24/windows-8-net-async-await-what-s-going-on.aspx http://blogs.msdn.com/b/windowsappdev/archive/2012/04/24/diving-deep-with-winrt-and-await.aspx http://msdn.microsoft.com/en-us/ library/vstudio/hh191443.aspx http://www.silverlightshow.net/items/Windows-8-Metro-Asynchrony-made-easy.aspx –

1

異步編程會導致混亂;正確的方法是通過Johan Paul的回答:分解你的函數並把它的一部分放到事件處理程序中。你的代碼最終會因相當凌亂,因爲你正在循環中執行異步操作。

你的問題同時具有WP7和WP7.1標籤;如果你只能支持WP7.1,那麼你可以選擇Microsoft.Bcl.Async庫(目前處於Beta版)。這使得在WP7.1 async/await,這是很容易:

for (int i = 1; i < 6; i++) 
{ 
    int j = 0; 
    Nos[j++] = Config[i]; 

    var xmladd = "uri to download data"; 
    WebClient _proxy2 = new WebClient(); 
    var result = await _proxy2.DownloadStringTaskAsync(xmladd); 

    ... 
}