본문 바로가기
.NET

C# delegate event, EventHandler 사용 예제

by leo21c 2023. 6. 3.

C#에서 이벤트를 보내는 방식이다.
이벤트를 보내는 것은 함수를 호출하는 것과 같다.

아래 예제 소스의 호출 순서도 함께 올린다.

 

C++  PostMessage와 같이 윈도우  Queue에 넣고 현재 프로세스를 진행하고 나중에  Message를 처리하는 그런 방식으로 구현을 하려면 Event Handler 방식으로는 처리를 할 수가 없다.

 

한 Class에서 다른 Class의 함수를 처리하면서 현재  Class에서 관련 내용을 마무리 하는 방식으로 구현을 할 때 이용을 할수가 있다.

 

아래 예제 코드는 Console 프로그램이다.


using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleEventTest
{
    public class EventDelegateTest
    {
        public delegate void MyEventHandler();
        public event MyEventHandler TestEvent;
        public void Do()
        {
            Trace.WriteLine("11");
            TestEvent?.Invoke();
        }
    }

    public class EventTest
    {
        public event EventHandler TestEvent2;
        public void Do()
        {
            Trace.WriteLine("33");
            TestEvent2(this, EventArgs.Empty);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Trace.WriteLine("1");
            EventDelegateTest edt = new EventDelegateTest();
            edt.TestEvent += new EventDelegateTest.MyEventHandler(doAction);
            Trace.WriteLine("2");
            edt.Do();
            Trace.WriteLine("3");

            EventTest et = new EventTest();
            et.TestEvent2 += new EventHandler(doAction2);
            et.Do();
            Trace.WriteLine("4");
        }

        static void doAction()
        {
            Trace.WriteLine("22");
            Console.WriteLine("Call event");
        }

        private static void doAction2(object sender, EventArgs e)
        {
            Trace.WriteLine("44");
            Console.WriteLine("Call event2");
        }
    }
}

위의 코드가 정상 실행되면 아래와 같은 순서로 처리가 된다.


1
2
11
22
3
33
44
4

위의 순서와 같이 함수 콜을 하는 것과 같다. 

 

현재 class에서 EventDelegateTest 도는 EventTest 객체의 함수를 호출했지만 그 결과를 현재  class에서 처리를 할 때 사용을 하면 된다.