Windows Phone 72010.06.09 16:12

휴~ 이거 때문에 엄청 힘듬었다.



일단 내가 원하는건



Silverlight 혹은 wp7 에서 



async를 하여 데이터를 받거나 이벤트에서 얻어온값을 리턴시키는것을 하고 싶었다 예를 들면



 public static void start()

{

WebClient webRequest = new WebClient();

var apiURI = new Uri("http://www.google.co.kr", UriKind.RelativeOrAbsolute);



webRequest.DownloadStringAsync(apiURI);

webRequest.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webRequest_DownloadStringCompleted);

}




이렇게 웹에 있는 내용을 다운받아서



static void webRequest_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)

{



}



이부분에서 구글 웹에 있는 페이지를 그 상위 페이지나 다른 class 에게 리턴 받고 싶었다...



이렇게 string webData = Download.Start();



근데 보면 알겠지만 DownloadStringCompleted 이벤트 메소드는 void 형이다... 어떻케 리턴시킬것인가?



만약 이벤트 뒤 webRequest.DownloadStringAsync(apiURI); 이부분뒤에 return을 한다고 해도 다운로드가 시작도 되기전에



이미 값을 리턴해 줘서 null값이 들어갈것이다...



그러면 방법은 Download가 다 되었을때 값을 리턴시켜야 한다. 



여기서 난 별짓을 다해보았지만 안되서 킴팀장님한테 물어봐서 겨우 알아냈다 (덕분에 핫식스 2개가 나갔지만)



방법은 Event핸들러를 밖에서 잡고 있는것과 Callback을 이용하는것이다.



일단 이벤트 핸들러를 이용해서 알아보자~





일단 Download.cs 라는 웹에서 긁어 오는 클래스가 있고



여기서 긁어온 웹데이타를 저장하는 mainpage.cs(기본) 가 있다. 



download class 전체 소스다



public class Download

{

//이벤트를 건다

public static event EventHandler<AsyncCompletedEventArgs> startCompleted;



public static void start()

{

WebClient webRequest = new WebClient();

var apiURI = new Uri("http://www.google.co.kr", UriKind.RelativeOrAbsolute);



webRequest.DownloadStringAsync(apiURI);

webRequest.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webRequest_DownloadStringCompleted);

}



static void webRequest_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)

{

string value = "Good Data"; //보낼데이타 e를 보내도 됨



if (startCompleted != null)

{

startCompleted(null, new AsyncCompletedEventArgs(null,false,value));

}

}

}




위에 보면 알겠지만  public static event EventHandler<AsyncCompletedEventArgs> startCompleted;



이렇케 이벤트를 걸고



if (startCompleted != null)

{

       startCompleted(null, new AsyncCompletedEventArgs(null,false,value));

}



이렇게 전달할값 value를 보낸다.



mainPage에서는 



 public MainPage()

{

InitializeComponent();

SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape;



Download.start();

Download.startCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(Download_startCompleted);

}



void Download_startCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)

{

Debug.WriteLine(e.UserState);

}




이렇게 아까 download class 에서 선정한 이벤트가 끝났을시  출력한다.



즉 다운로드가 끝났을때 출력한다는것이다. 이것을 저장을 하던지 요리를 하면 되는것이다.



알고 보면 쉽지만 인터넷에 나와있지 않다.... (단한군대도... 내가 구글링이 실력이 부족한가...)



일단 나중에 헷갈릴수 있으니 파일로 등록해 놓자.



sample for wp7



[#FILE|event_handler_sample.zip|pds/201006/09/37/|mid|0|0|pds20|0#]



Posted by 동동(이재동)

댓글을 달아 주세요