본문 바로가기
유니티 공부/C# 문법

C# - await와 async

by 코딩하는 돼징 2024. 1. 19.
반응형

Sum을 구하는 코드로 예시

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

        private void button1_Click(object sender, EventArgs e)
        {
            Run();
        }
        private void Run()
        {
        }

        private int Calc(int n)
        {
            int result = 0;
            for (int i = 1; i <= n; i++)
            {
                result += i;
                // .. 작업 중
                Thread.Sleep(1000);
            }
            return result;
        }
    }
}

1. 동기 작업

private void Run()
{
    int sum = Calc(10);
    label1.Text = sum.ToString();
}

버튼을 클릭하면 mainThread즉 UIThread가 Calc메서드를 처리하면서 다른 UI관련작업을 진행할 수 없게 된다.


2. 비동기 작업

01 async 

await를 사용하기 위해서는 메서드 선언 부분에 async를 사용해주어야 한다. async를 추가하면 해당 메서드를 비동기로 만든다. 

private async void ExampleAsync()
{
    // 비동기 작업 수행
}

02 await

비동기 메서드에서 Task나 Task<T>의 작업이 완료되는 것을 기다린다. await가 실행되면 현재 메서드의 실행은 일시 중지되며 해당 작업이 완료될 때까지 다른 작업이 수행된다.

private async void Run()
{
    var task1 = Task.Run(() => Calc(10));
    int sum = await task1; // 상태를 저정한다음 다른 UI처리
    label1.Text = sum.ToString();
}

Task처리 뿐만 아니라 다른 UIThread를 block하지 않기 때문에 다른 UI처리를 계속해서 진행할 수 있다. 아래와 같이 버튼을 누르고 나서 화면을 키우는 또 다른 작업이 진행됨을 확인할 수 있다.

 

 

 

 

반응형

댓글