본문 바로가기
c#

[c#] BeginInvoke사용법 및 예제 -1-

by devjh 2020. 8. 3.
반응형

개요

1. Thread

2. lock

3. BeginInvoke(비동기, 스레드풀)

4. BeginInvoke2(비동기 리턴값)

5. BeginInvoke3(콜백)

6. BeginInvoke4(BeginInvoke예제)

 

 


이번게시글에서는 BeginInvoke에 대해 알아보겠습니다.

 

BeginInvoke는 delegate와 함께 캡슐화된 예약어입니다.

 

delegate사용법은 아래 게시글을 참고해주세요

 

c# delegate, event 사용법과 사용예제

delegate는 메서드 대리자입니다. delegate로 메서드 대리자를 선언해주고 원하는 메서드를 참조시킬수 있습니다. 쉽게말하면 함수를 보관하는 통을 만들고(대리자선언) 그 통안에 함수를 넣고 나중

frozenpond.tistory.com

 

 

 

1. 예제

namespace BeginInvokeTest
{
    delegate void myDelegate();
    class Program
    {
        static void Main(string[] args)
        {
            myDelegate a = Func;

            // a를 어떻게 불러올지 결정해보자
            // 1. a();
            // 2. a.Invoke();
            // 3.a.BeginInvoke(null, null);

            for (int i = 0; i < 3; i++)
            {
                Console.WriteLine("메인스레드는 이걸 세번 출력해주고 프로그램이 종료될 것이야~");
                Thread.Sleep(100);
            }
        }

        private static void Func()
        {
            Console.WriteLine(Thread.CurrentThread.IsBackground);
            Console.WriteLine(Thread.CurrentThread.IsThreadPoolThread);

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(i+1);
                Thread.Sleep(100);
            }
        }
    }
}

 

 

주석처리된 케이스를 하나씩 확인해보겠습니다.

 

1. a() -> 메서드를 호출합니다.

2. a.Invoke() -> 메서드를 동기적으로 호출합니다. 

3. a.BeginInvoke(null,null) -> 메서드를 비동기로 호출합니다.

 

1번과 2번의 기능은 위의 코드상에서는 동일합니다.

 

일반적인 방식으로 함수를 호출한 결과입니다.

1번과 2번의 실행결과

 

1~10까지 출력해준후 메인함수가 출력됩니다.

 

3번의 실행결과

BeginInvoke로 해당코드를 실행한 결과입니다.

마치 스레드를 생성해 두개의 로직을 실행한것과 비슷한 결과가 나옵니다.

 

그러나 1부터 10까지 출력을 하지 못했는데 프로그램이 종료된걸 확인할 수 있습니다.

 

마치 백그라운드 스레드를 돌렸을때랑 동일한 결과가 나옵니다.

 

그리고 해당 메서드에 백그라운드 스레드인지, 스레드풀스레드인지 불 형식으로 출력하는 코드도 넣었습니다.

 

Console.WriteLine(Thread.CurrentThread.IsBackground);
Console.WriteLine(Thread.CurrentThread.IsThreadPoolThread);

 

결과는 True, Ture 입니다.

 

BeginInvoke 키워드를 사용하면

 

어떠한 작업을 백그라운드 스레드로 돌리며, 스레드풀에 들어가서 실행된다는걸 확인 할 수 있습니다.

 

 

스레드풀이란

풀이란 재사용이 가능한 자원을 빠르게 할당하기위해 미리 준비된 공간입니다.

 

스레드풀이란

 

스레드의 생성, 소멸에 드는 자원을 최소화하기위해 미리 준비된 공간입니다.

 

결론적으로는 비동기 처리를 하는것은

 

스레드를 만들어서 처리하는 것과 비슷하지만 생성, 소멸의 비용이 최소화됐다는 차이점이 있습니다.

 

보통 데이터폴링처럼 whlie루프를 통해 계속 실행해야 하는 로직이나 성능적으로 주요한 로직은

 

직접 스레드를 할당하여 사용하고

 

그외의 비동기로 처리해야할 작업(디스크 IO, 파일 IO 등등)은 스레드풀에서 실행하는 경우가 많습니다.

 

스레드풀의 스레드는 일반 스레드보다 우선순위가 낮으며

 

스레드풀에서 처리해야 할 작업이 많으면 성능 및 안정성이 보장되지 않는다는 특징이 있으니

 

데이터 폴링 같은 작업은 일반 스레드를 만들어서 하는게 좋다고 합니다.


다음게시글에서는 비동기호출의 리턴값을 받아오는방법에 대해 포스팅하겠습니다.

 

 

반응형

댓글