2014년 11월 6일 목요일

윈도우 8에서 비동기 처리(await, async)를 사용하는 방법

윈도우 8에서 비동기 처리(await, async)를 사용하는 방법
 조회 : 321
나의 폴더 > C# | 2013-02-05 (Tue) 20:09http://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);
        }

    }
}

댓글 없음:

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.

송길영 작가의 신간 - "경량문명의 탄생" 독서 후기입니다.

  문명이 바뀌고 있다는 것을 누구나 감지하고 있습니다. ㅎㅎ 중량문명이 아닌 경량문명의 시대가 도래하고 있습니다. 수업을 하면서, 또는 친구들과 대화하면서 문명이 바뀌고 있다는 말을 자주했는데 정말 설명하기 좋은 단어가 바로 "경량문명...