윈도우 8에서 비동기 처리(await, async)를 사용하는 방법 | |
나의 폴더 > C# | 2013-02-05 (Tue) 20:09 | http://blog.dreamwiz.com/papasmf1/13929019 |
비동기 처리는 기존의 닷넷 코드에서도 어렵지 않은 코드였지만 점점 더 쉬워지고 있습니다.
아래의 데모 코드는 WPF 기반으로 생성된 프로젝트의 데모 코드입니다. using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace DemoAsyncAwait { /// <summary> /// MainWindow.xaml에 대한 상호 작용 논리 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Button_Click_1(object sender, RoutedEventArgs e) { Label1.Content = "오랜 시간이 걸리는 작업..."; Task<string> task1 = Task.Run<string>(() => { System.Threading.Thread.Sleep(10000); return "작업 완료"; }); //이 코드는 작업이 완료될 때 까지 UI 쓰레드를 블러킹한다. Label1.Content = task1.Result; } //async 와 await에 주의한다. private async void Button_Click_2(object sender, RoutedEventArgs e) { Label1.Content = "오랜 시간이 걸리는 작업..."; Task<string> task1 = Task.Run<string>(() => { System.Threading.Thread.Sleep(10000); return "작업 완료"; }); //아래의 코드는 task1의 결과가 가능할 때 호출된다. //await는 비동기 메서드에서만 호출 가능하다. Label1.Content = await task1; } //리턴형을 Task<T>형으로 담아서 처리해야 한다. private async Task<string> GetData() { var result = await Task.Run<string>(() => { Thread.Sleep(10000); return "Operation Complete."; }); return result; } private async void Button_Click_3(object sender, RoutedEventArgs e) { //리턴 값이 있는 비동기 처리의 경우 Label2.Content = await GetData(); } private async void Button_Click_4(object sender, RoutedEventArgs e) { await GetCoffees(RemoveDuplicates); } public async Task GetCoffees(Action<IEnumerable<string>> callback) { //DB를 엑세스하는 것처럼 시뮬레이션 한다. var coffees = await Task.Run(() => { var coffeeList = new List<string>(); coffeeList.Add("Caffe Americano"); coffeeList.Add("Cafe au Lait"); coffeeList.Add("Cafe au Lait"); coffeeList.Add("Espresso Romano"); coffeeList.Add("Latte"); coffeeList.Add("Macchiato"); return coffeeList; }); await Task.Run(() => callback(coffees)); } //콜백 메서드 private void RemoveDuplicates(IEnumerable<string> coffees) { IEnumerable<string> uniqueCoffees = coffees.Distinct(); Dispatcher.BeginInvoke(new Action(() => { List1.ItemsSource = uniqueCoffees; })); } private async void Button_Click_5(object sender, RoutedEventArgs e) { //APM형태로 작업하는 Begin, End 메서드들 string url = Textbox1.Text; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse response = await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, request) as HttpWebResponse; //response의 상태 코드를 표시 Label3.Content = String.Format("입력된 URL의 상태 코드: {0}", response.StatusCode); } } } |
댓글 없음:
댓글 쓰기
참고: 블로그의 회원만 댓글을 작성할 수 있습니다.