2011-04-22 76 views
1

我需要一些代碼來讓我知道異步線程何時完成。這是我製作的Windows手機應用程序。該應用程序是一個公交車追蹤器,用於顯示實時離境,數據將從在線網頁中獲取。如何使我的函數等到異步函數完成?

我有這行代碼在我GetDataFeed功能

// start the asynchronous request 
IAsyncResult aResult = BusStopFeedRequest.BeginGetResponse(new AsyncCallback(HandleFeedData), myState); 

這將觸發了我的HandleFeedData功能,將節省一個網站源代碼轉換成文本字符串變量。

我的問題是我手機上的文本框不會填充字符串的內容,因爲字符串中沒有數據。這被textbox1.Text = obj.GetText()調用,它應該返回我的實例化類中的私有字符串。

我已經調查使用aResult.AsyncWaitHandle.WaitOne(),並試圖爲aResult.IsCompleted()方法輪詢但是從我閱讀和發現自己,這只是不工作。該WaitOne拋出一個意外的錯誤和IsCompleted輪詢是一個永無止境的循環。

有沒有人有任何見解我能做些什麼讓我的功能等待異步請求完成於是更新我的類變量,所以我的文本框,就可以看到數據

+0

你能改善這個問題的標題嗎? – 2011-04-22 00:28:52

+0

http://xkcd.com/725/ – 2011-04-22 00:30:38

+0

難道我的回答解決問題了嗎? (我知道這是前一陣子,但如果你記得我的回答是否正確,我會很感激你的標記)。謝謝! :) – 2012-04-24 09:54:58

回答

0

你肯定的是,字符串實際上是被下載的? 「BeginGetResponse」是WebRequest類中的一項功能,在Windows Phone上不可用。有可能數據沒有被下載。但是,如果正在下載的話,我建議你做這樣的事情:

IAsyncResult aResult = BusStopFeedRequest.BeginGetResponse(new AsyncCallback(HandleFeedData)); 

然後:

private void HandleFeedData(IAsyncResult result) 
{ 
    string feedData = (string)result.AsyncState; 
    textbox1.Text = feedData; 
    // code to save the feedData here 
} 

不過,這將是有益的知道什麼時候BusStopFeedRequest的「BeginGetResponse」被解僱。

0

在windows phone中,HTTPWebRequest包含BeginGetResponse和EndGetResponse方法。您需要在函數HanldeFeedData函數中添加類似的代碼。

HttpWebResponse response=(result.AsyncState as HttpWebrequest).EndGetResponse(result) as HttpWebResponse; 
string returnValue=null; 
    using (StreamReader sr=new StreamReader(response.GetResponseStrem()) 
    { 
     returnValue=sr.ReadToEnd(); 
    } 

    Dispatcher.BeginInvoke(new Action(()=>textbox1.Text=returnValue)); 
相關問題