휴~ 이거 때문에 엄청 힘듬었다.
일단 내가 원하는건
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#]
'Windows Phone 7' 카테고리의 다른 글
[wp7] Facebook 인증 및 게시물 올리기 (2) | 2010.06.11 |
---|---|
[wp7] Event Handler러 대신 Callback 이용하여 return 하기 (0) | 2010.06.09 |
[wp7] compact .net framework 에서는 SortDictionary를 사용할수 없다? (0) | 2010.06.08 |
[wp7] 윈도우폰 sdk에서 md5 를 사용할수없다? (0) | 2010.06.07 |
[wp7] XmlSerializer 하위 엘리먼트 로드 하기 (0) | 2010.05.27 |