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

    }
}

댓글 없음:

댓글 쓰기

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

5월 14일 새벽에 chatGPT 4o가 발표되었습니다. 옵티마이즈, 옴니라는 의미인데 실시간 통역, 다자간 회의, 멀티모달 기능의 강화등이 보이네요.

  초격차로 OpenAI진영이 다시 앞서가는 모양을 보여주고 있습니다. 저도 새벽에 일어나자 마자 올라온 영상들과 글을 정리하고 있습니다. ㅎㅎ 영화 HER의 사진이 새벽에 많이 올라왔었는데 저도 안본 영화입니다. 주말에 한번 봐야 할 것 같습니다....