2012-01-21 3 views
1

내 응용 프로그램에는 DataGrid이 들어있는 WPF 창이 있습니다. Window_Loaded 이벤트에서 서버에서 JSON 데이터를 가져와 deserialize 한 후 List<T>으로 변환하면 데이터 그리드에 바인딩됩니다. 이런 식으로 모든 것이 잘 작동합니다.C# WPF에서 비동기 웹 요청을 만드는 방법

문제 :

그러나 코드의 요청 부분은 시간이 걸리고 어떤 요소가로드되지로 전체 창은 데이터 grid.I 우리가 보여 단지 AJAX와 같이 요청 부분의 비동기을 만들고 싶어 포함 흰색 보인다 무언가가로드되는 동안의 로더 이미지, 그리고로드되었을 때 내용을 보여주기 위해 콜백 함수 사용. 단계별로 단계

  1. 로드 창 및 요소 데이터 그리드 버튼 등 서버와 쇼
  2. 만들기 웹 요청의 데이터가로드 .. '레이블에서 가능.
  3. 데이터가로드되었음을 알리는 이벤트 나 다른 것을 실행 한 다음 데이터 그리드를 목록에 바인딩하여 응용 프로그램이 전체 웹 요청 부분 동안 응답 및 활성 상태를 유지하도록합니다. 여기

내가 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

사용 WebRequest.BeginGetResponse 대신하는 GetResponse 및 직렬화 된 결과를 할당은

다른 스레드에서 만든 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); 

} 
관련 문제