簡體   English   中英

在WP7上等待異步完成的最佳方法

[英]Best way to wait async to complete on WP7

我在這方面遇到了一些困難,我正在嘗試推出我的第一個WP7應用程序。 我有一種從網站下載html並對其進行正則表達式的方法,但是問題是,當我第一次單擊該按鈕時,什么也沒有發生,在第二次嘗試中,它完美地填充了網格,當我調試時我看到了在啟動方法之前,已經正確分配了帶有HTML的字符串。 因此,問題是,等待異步方法完成的最簡單方法是什么? 我已經搜索過有關CTP異步和其他方法的信息,但是我無法使其正常工作。 這是代碼

   public static void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        doc = e.Result;
    }

    public static List<Row> Search(string number)
    {
        WebClient wClient = new WebClient();

        sNumber = number;
        int i = 0;
        DateTime datetime;

        wClient.DownloadStringAsync(new Uri(sURL + sNumber));
        wClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
              /*More code*/
     }

該按鈕調用方法Search()並使用返回的列表填充網格。

wClient.DownloadStringAsync(new Uri(sURL + sNumber)); 方法在該方法中的所有代碼執行完后執行。

1)首先doc為空

2)然后調用wClient.DownloadStringAsync(new Uri(sURL + sNumber)); 但是沒有執行!

3)然后返回doc(仍然為null)

4)之后, wClient.DownloadStringAsync(new Uri(sURL + sNumber)); 執行並填寫doc

這就是為什么當您第二次按下“搜索”按鈕時,網格被完美填充

注意:在調用async方法之前,您必須注冊DownloadStringCompletedEventHandler 而且您只需注冊一次該事件處理程序,即在構造函數中,因為每次執行此方法時都會添加一個事件處理程序。 因此,如果您按“搜索”按鈕5次,則網格會被填充5次,盡管您沒有注意到

一種解決方案是:

這是代碼

   public static void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Result != null)
        {
            //populate grid view
        }
    }

    public static void Search(string number)
    {
        WebClient wClient = new WebClient();

        sNumber = number;
        int i = 0;
        DateTime datetime;

        wClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); //this should be added in the constructor, so it would only be added once
        wClient.DownloadStringAsync(new Uri(sURL + sNumber));
     }

您的代碼中至少有兩個問題: 調用DownloadStringAsync 之前,您需要先訂閱DownloadStringAsync否則, DownloadStringCompleted 之前有可能完成下載。 另外,由於您的完成方法確實很短,您可以使用lambda進行內聯。

其次,您的方法是異步的 -由於Web調用是異步執行的 ,因此不會返回List<Row> 您將必須在完成方法中填充網格,並使方法返回空值。 這就是為什么它第二次“起作用”的原因-返回第一個調用的現已完成的結果。

wClient.DownloadFileCompleted += (sender, e) =>
{
    //you should also do error checking here
    //populate grid 
};
wClient.DownloadStringAsync(new Uri(sURL + sNumber));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM