2012-01-21 27 views
1

私のアプリケーションには、DataGridというWPFウィンドウがあります。 Window_Loadedイベントで私はサーバーからJSONデータを取得し、それをデシリアライズしてList<T>に変換すると、それをデータグリッドにバインドします。すべてがこのようにうまく機能しています。C#WPFで非同期のWebリクエストを作成する方法

問題:

しかし、コードの要求部には時間がかかり、全体のウインドウがデータgri​​d.I含めていない要素をロードして白いようだ我々は示してちょうどAJAXのように要求部の非同期を作りたいです何かがロードされている間のローダーイメージと、ロードされたときにコンテンツを表示するためのコールバック関数を使用します。ステップバイステップで

  1. ロードウィンドウや要素データグリッドボタンなど。サーバーやショーへ
  2. メイクのWeb要求のデータをロードしている.. 'ラベルで、おそらく。
  3. データがロードされたことを通知するイベントまたは何かを起動し、データグリッドをリストにバインドして、Webリクエスト全体のアプリケーション中にアプリケーションが応答性とアクティブのままになるようにします。ここで

は私がthisリンクを発見した

WebResponse response = req.GetResponse(); 
Stream responseStream = response.GetResponseStream(); 
StreamReader sr = new StreamReader(responseStream, Encoding.UTF8); 
string JSON = sr.ReadToEnd(); 
List<MyObject> returnedData = JsonConvert.DeserializeObject<List<MyObject>>(JSON); 

Window_Loadedイベントハンドラで使用している現在の非非同期コードですが、私はそれは私の問題にも適用するかどうかはわかりませんよ。これについてどうやって行くかについての助けやアイデアは大歓迎です。

答えて

1

代わりのGetResponseの使用WebRequest.BeginGetResponseに、コールバックメソッド

のリストにシリアル化された結果を割り当てるには、別のスレッドで作成されたUI要素に別のスレッドからのデータを割り当てるために、あなたが使用してUIにメッセージを送る必要があることを忘れてはいけませんdispatcher

希望これは

+0

「ディスパッチャ」とは、 –

2

このコードはSilverlightのサンプルスニペットで、WPFでも同様に適用されるはずです。

HttpWebRequest myRequest = WebRequest.CreateHttp("http://yoururl); 
myRequest.Method = "GET"; 
myRequest.BeginGetResponse(GetResponseCallback, myRequest); 

private void GetResponseCallback(IAsyncResult asynchronousResult) 
{ 
    try 
    { 
     WebResponse resp = request.EndGetResponse(asynchronousResult); 
     HttpWebResponse response = (HttpWebResponse)resp; 
     Stream streamResponse = response.GetResponseStream(); 
     StreamReader streamRead = new StreamReader(streamResponse); 
     string responseString = streamRead.ReadToEnd(); 
     // Close the stream object 
     streamResponse.Close(); 
     streamRead.Close(); 
     // Release the HttpWebResponse 
     response.Close(); 

     //Do whatever you want with the returned "responseString" 
     Console.WriteLine(responseString); 

} 
関連する問題