0

私はこれに苦労しています。最初の WP7 アプリを公開しようとしています。Webサイトからhtmlをダウンロードして正規表現する方法がありますが、問題は、ボタンを初めてクリックしても何も起こらず、2回目の試行でグリッドが完全に埋められ、デバッグ中に見たHTML を含む文字列は、メソッドが開始される前にすでに正しく割り当てられています。問題は、非同期メソッドが終了するのを待つ最も簡単な方法は何ですか? CTP async やその他の方法について検索しましたが、うまく機能させることができません。これがコードです

   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() を呼び出し、返されたリストを使用してグリッドを埋めます。

4

2 に答える 2

2

メソッドは、その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埋められます。

そのため、検索ボタンを 2 回押すと、グリッドが完全に埋められます。

DownloadStringCompletedEventHandler注意async メソッドを呼び出す前に を登録する必要があります。また、このメソッドが実行されるたびにイベント ハンドラーを追加するため、このイベント ハンドラーを一度、つまりコンストラクターで登録するだけで済みます。検索ボタンを 5 回押すと、気付かないうちにグリッドが 5 回埋まります。

1つの解決策は次のとおりです。

これがコードです

   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));
     }
于 2012-04-15T15:12:47.623 に答える
1

コードには少なくとも2つの問題があります。呼び出すDownloadStringCompleted DownloadStringAsyncにサブスクライブする必要があります。そうしないと、サブスクライブする前にダウンロードが完了する可能性があります。また、完了メソッドは非常に短いため、ラムダを使用してこれをインラインで実行できます。

次に、メソッドは非同期です。Web呼び出しは非同期で実行されるため、メソッドは返されません。List<Row>完了メソッドにグリッドを設定し、メソッドがvoidを返すようにする必要があります。これが、2回目に「機能」する理由です。最初の呼び出しの完了した結果が返されます。

wClient.DownloadFileCompleted += (sender, e) =>
{
    //you should also do error checking here
    //populate grid 
};
wClient.DownloadStringAsync(new Uri(sURL + sNumber));
于 2012-04-15T15:10:12.567 に答える