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

    }
}

댓글 없음:

댓글 쓰기

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

Xcode 26의 새로운 기능들

 애플의 AI준비에 대한 골든타임이 지나가고 있다는 말이 많이 들립니다. ㅎㅎ  애플의 그동안의 패쇄적인 환경을 생각하면 온디바이스AI나 LLM환경에서 다소 아쉬운 부분이 많이 있습니다. 다른 빅테크들과 전혀 다른 방향의 목소리를 내고 있어서 좀 우려...