[C#] 비동기 프로그래밍

728x90

1. 동기와 비동기

일반적으로 코드는 동기적으로 실행됩니다. 동기적으로 실행된다는 말은 아래 그림처럼 요청 후 반환받은 후 다음을 실행한다는 뜻입니다.

 

 

반면에 비동기는 요청을 보낸후 반환을 기다리지 않습니다.

 

숫자를 보시면 반환되는 순번은 적혀있지 않습니다. 왜냐하면 코드가 실행되는데 걸리는 시간에 따라 반환 순서가 달라질 수 있기 때문입니다.

 

이러한 이유로 비동기는 동기보다 일반적으로 속도가 빠릅니다. 동기에 비해 대기하는 시간이 적기때문입니다.

 

반면에 비동기의 단점으로는 순서를 보장할 수가 없습니다.

 

2. 비동기 사용방법

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

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

        //메서드를 참조
        delegate void mySettingDelegate(string str);
        
        private void Form1_Load(object sender, EventArgs e)
        {
            string mystr = "";

            //AsyncCallBack -> 비동기작업이 모두 끝난후 실행할 함수 지정

            AsyncCallback callback = new AsyncCallback(callbackFunction);
            //비동기
            mySettingDelegate msd = mySetting;

            //네트워크 통신에서 주로 사용
            //BeginInvoke는 비동기로 실행
            //callbackFunction("aaa") 실행
            //비동기 작업이 끝났는지 확인
            IAsyncResult ir = msd.BeginInvoke(mystr, callback, "aaa");

            bool state = ir.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(3)); //3초 후 비동기 작업이 끝나있는지 확인
            //비동기 작업이 끝났다면 true 반환 끝나지 않았다면 false 반환

            if (!state) //false 일경우
            {
                MessageBox.Show("작업이 실행중임");
            }


            label1.Text = mystr;   
        }

        //콜백 함수
        private void callbackFunction(IAsyncResult ir)
        {
            string str = (string)ir.AsyncState; //aaa 출력
            MessageBox.Show(str);
        }

        private void mySetting(string str)
        {   
            for(int i = 0; i < 100; i++)
            {
                str += "a";
            }
            //다른 스레드에서 메서드 실행
            label1.Text = str;

            //익명함수
            this.BeginInvoke((Action)(() => 
            {
                for(int i = 0; i < 100; i++)
                {
                    str += "a";
                }
            }));
            Thread.Sleep(5000);
        }
             
        
    }
}

'C# Programming > C#' 카테고리의 다른 글

[C#] Timer  (0) 2024.05.15
[C#] 이벤트 게시 및 수신  (0) 2024.05.15
[C#] 멀티스레드  (0) 2024.05.14
[C#] 데이터 베이스 연결 및 기본 CRUD  (1) 2024.05.14
[C#] 객체지향 프로그래밍  (0) 2024.05.14