2012-03-15 8 views
1

をダウンロードしたまで待ちます。Webクライアント - ファイルが、私は、XMLファイルから生成されたコレクションを返す関数を、開発してい

当初、私はテストのためにローカルXMLファイルを使用していたが、今私は、アプリケーションがサーバーから本当のxmlファイルをダウンロード持って準備ができています。私はWebClientオブジェクトにOpenReadCompletedイベントハンドラを与える必要があるという事実のために、これをどうすればいいのか分かりません。このハンドラからコレクションデータを返すことはできません。また、このハンドラが実行されるまでに元の関数が終了しました。

次のように私の元のコードは次のとおりです。

public static ObservableCollection<OutletViewModel> GetNear(GeoCoordinate location) 
{ 
    ObservableCollection<OutletViewModel> Items = new ObservableCollection<OutletViewModel>(); 

    // Load a local XML doc to simulate server response for location 
    XDocument xDoc = XDocument.Load("SampleRemoteServer/outlet_list.xml"); 

    foreach (XElement outlet in xDoc.Descendants("outlet")) 
    { 
     Items.Add(new OutletViewModel() 
     { 
      Name = outlet.Attribute("name").Value, 
      Cuisine = outlet.Attribute("cuisine").Value 
     }); 
    } 

    return Items; 
} 

どのように私は、この機能では、ファイルをロードし、イベントハンドラの実行を持って、その後、機能を継続することができますか?

私は、イベントハンドラコードによって更新される変数をチェックし続けるためにループを追加することしか考えられませんでしたが、それは良い解決策のようには聞こえません。あなたが完了したイベントにforeach()ループを移動

おかげで、 ジョシュ

+0

それはそれはあなたがあなたのデザイン –

+0

を微調整する必要があることを意味していても、非同期リクエストの上まで読んで価値があるかもしれないので、あなたは私が非同期で探し始めましたが、UIスレッドをブロックしたくありません/キーワードを待って、ありがとう! – Josh

答えて

1

あなたは非同期プログラミングを見てみることを開始する必要があります。 公式のイベントを実装し、そのイベントを呼び出し側のクラスに登録するのは、(古い学校の)方法です。

はしかし、コールバックを使用すると、よりエレガントです。私はあなたが上に構築できること(役に立たない、まだ概念的に有効な)単純な例を手早く:あなたはC# async時流(link for WP7 implementation)に飛び乗るしたい場合は、新しいasyncを使用してそれを実装することができ

public static void Main(string[] args) 
{ 
    List<string> list = new List<string>(); 

    GetData(data => 
    { 
    foreach (var item in data) 
    { 
     list.Add(item); 
     Console.WriteLine(item); 
    } 
    Console.WriteLine("Done"); 
    }); 
    Console.ReadLine(); 
} 

public static void GetData(Action<IEnumerable<string>> callback) 
{ 
    WebClient webClient = new WebClient(); 
    webClient.DownloadStringCompleted += (s, e) => 
    { 
     List<string> data = new List<string>(); 
     for (int i = 0; i < 5; i++) 
     { 
     data.Add(e.Result); 
     } 
     callback(e.Error == null ? data : Enumerable.Empty<string>()); 
    }; 

    webClient.DownloadStringAsync(new Uri("http://www.google.com")); 
} 

をしてawaitキーワード:

public static async void DoSomeThing() 
{ 
    List<string> list = new List<string>(); 
    list = await GetDataAsync(); 

    foreach (var item in list) 
    { 
    Console.WriteLine(item); 
    } 
} 

public static async Task<List<string>> GetDataAsync() 
{ 
    WebClient webClient = new WebClient(); 
    string result = await webClient.DownloadStringTaskAsync(new Uri("http://www.google.com")); 

    List<string> data = new List<string>(); 
    for (int i = 0; i < 5; i++) 
    { 
    data.Add(result); 
    } 
    return data; 
} 
+0

もちろん、.Net 4.5はWindow-Phone-7のオプションではありません。 –

+0

これは役に立つと思われますが、私はこれをWP7で使用できるはずですが、明日は正しく見ていきます。 .. http://www.abhisheksur.com/2011/04/async-support-for-silverlight-and-wp7.html – Josh

+0

WP7アプリケーションでasync CTPを使用することができます:http://msdn.microsoft.com/en -us/vstudio/gg316360 –

2

そして、それは確かにあなたが元のメソッドからは何も返さないことを意味します。 voidにします。 I/Oは動作しますが、より良いそれに慣れる非同期(async)

これはどのようにあります。あなたはデザインを考え直す必要があります。

関連する問題