[C# 문법] Task 클래스를 이용한 비동기 처리 방법

소개

  • 안녕하세요. 오늘은 C# 문법에서 비동기 처리하는 방법에 대한 기초를 공부해 보려고 합니다.
  • 우선 그 첫 번째로, Task 클래스를 이용한 비동기 처리 방법에 대해서 알려 드리겠습니다.

준비 과정

  • 첫 번째로, 윈폼 프로젝트를 생성합니다.
  • 그리고 Button, Label 2개의 컨트롤을 다음과 같이 배치합니다.
  • 마지막으로 아래와 같이 코드를 작성합니다.
  • 아래 프로그램을 실행시키면, Button 컨트롤을 클릭하는 동안 프로그램의 마우스가 빙빙 돌면서 Work() 메서드 작업이 끝날때 까지 다른 작업을 할 수 없게 됩니다.
  • 즉, 프로그램이 "응답없음" 상태가 되어 버리는 점입니다.
  • 이제 Task 클래스를 이용하여, 해당 부분을 비동기 처리하여 Work() 메서드가 동작하더라도 다른 동작을 할 수 있도록 예제 코드를 수정해 보도록 하겠습니다.

using System;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void uiBtn_Test_Click(object sender, EventArgs e)
        {
            uiLb_Test.Text = string.Empty;
            Cursor = Cursors.WaitCursor;
            Work();
            uiLb_Test.Text = "종료";
            Cursor = Cursors.Arrow;
        }

        private void Work()
        {
            Thread.Sleep(2000);

            int sum = 0;
            for(int index = 0; index < 10000; index++)
            {
                sum += index;
            }
        }
    }
}

Task 클래스 이용한 비동기 처리

  • Task 클래스는 .NET Framework 4.0 부터 도입된 개념입니다.
  • Thread 클래스를 대체할 수 있는 녀석인데요. Thread 클래스를 사용했을 때는 스레드를 생성, 삭제 하는데 비용이 드는 문제가 있었습니다.
  • 하지만, Task 클래스는 그 문제를 해소함과 동시에 더욱 수준 높은 기능들을 제공합니다.
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void uiBtn_Test_Click(object sender, EventArgs e)
        {
            uiLb_Test.Text = string.Empty;
            Task.Run(() => Work());
        }

        private void Work()
        {
            Thread.Sleep(2000);

            int sum = 0;
            for(int index = 0; index < 10000; index++)
            {
                sum += index;
            }

            uiLb_Test.Text = "종료";
        }
    }
}
  • 위와 같이 Task.Run 메서드에서 Work 메서드를 비동기로 호출합니다.
  • 때문에, Button 클릭이 이루어 지고 Work 함수가 끝나지 않았음에도 프로그램 제어권은 살아 있고 다른 동작들을 처리할 수 있습니다.

728x90

이 글을 공유하기

댓글

Designed by JB FACTORY