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);
        }

    }
}

댓글 없음:

댓글 쓰기

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

'일론 머스크' '젠슨 황' AI 리더들, 그들의 성공 비결은 바로 이것 - 누가 부자가 되는가 영상입니다. ㅎㅎ

  책을 통해서만 접했던 내용들을 영상으로 보니 더 실감이 납니다. KBS에서 방송된 내용인데 주말에 보시면 좋은 영상입니다. 엔비디아의 주가가 이해가 됩니다. ㅋㅋ 생각보다 미국시장이 강한 것이 AI는 거의 미국과 중국이 주도하는 시장이 되고 있습...