티스토리 뷰

프로그래밍/C#

이벤트 정의

에어버스 2022. 10. 19. 08:21

 

ConsoleApp3.zip
0.02MB

독자적인 이벤트를 정의하고 사용하는 방법이다.
여기서는 Connection 개체(이벤트를 발생시킨다)와 Display 개체(이벤트를 처리한다)를 구현해본다.

<Connection.cs>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Timers;
 
namespace ConsoleApp3
{
    public delegate void MessageHandler(string messageText); // 대리자 정의
    internal class Connection
    {
        public event MessageHandler MessageArrived; // 이벤트가 사용할 대리자 형식 지정하고 이벤트 이름 지정
        private Timer pollTimer;
 
        public Connection()
        {
            pollTimer = new Timer(100);
            pollTimer.Elapsed += new ElapsedEventHandler(CheckForMessage); // 이벤트 등록
        }
 
        public void Connect() // 생성자
        {
            pollTimer.Start();
        }
 
        public void Disconnect()
        {
            pollTimer.Stop();
        }
 
        private void CheckForMessage(object source, ElapsedEventArgs e)
        {
            Console.WriteLine("Checking for bew message.");
            Random random = new Random();
            if ((random.Next(9== 0&& (MessageArrived != null))
                MessageArrived("Hello Mum!"); // 이벤트 발생
        }
    }
}
cs

6행 : 이벤트를 정의하기 전에 먼저 이벤트가 사용할, 이벤트에 대한 이벤트 처리기에 쓰이는 서명을 지정하는 대리자 형식을 정의해야 한다.
MessageHandler 라는 대리자 형식은 하나의 string 매개변수를 받고 아무 것도 돌려주지 않는(void) 함수 서명을 정의한다. Connection 개체가 받은 인스턴트 메시지는 이 string 매개변수를 통해서 Display 개체에 전달된다.
대리자를 정의 했다면(또는 적절한 기존 대리자를 찾았다면) 이벤트 자체를 Connection 클래스의 한 멤버로 정의 할 수 있다.

9행 :  event 라는 키워드를 지정하고 이벤트가 사용할 대리자 향식(MessageHandler)을 지정하고 마지막으로 이벤트 이름(MessageArrived)을 지정하는 방식이다.
이렇게 해서 이벤트를 지정한 후에는 33g행 처럼 이벤트 이름을 하나의 메시드처럼 호출해서(서명은 대리자로 지정한 것과 일치해야 한다) 이벤트를 발생시킬 수 있다.

32행 :0~9사이 난주 발생해서 0 이면 이벤트를 발생시킨다. 이벤트 처리기가 등록되어 있지 않으면 MessageArrived 는 null 이 되어, 이벤트가 등록되었는지 검사한다.

생성자인 Connection() 에서 타이머가 만들어지고, Elapsed 이벤트에 대한 CheckForMessage 이벤트 처리기를 등록한다.시작되고 Disconnect() 에 의해 타이머 종료한다.

<Display.cs>

1
2
3
4
5
6
7
8
9
10
11
12
using System;
 
namespace ConsoleApp3
{
    internal class Display
    {
        public void DisplayMessage(string message) // 이벤트 
        {
            Console.WriteLine("Message arrived : {0}", message);
        }
    }
}
cs

7행 : MessageArrived 이벤트의 대리자 형식의 서명(Connection.cs 의 6행, pulic, void, string)과 일치해야 한다.
그리고, public으로 선언되어 있는데 다른 클래스가 발생시킨 이벤트를 처리하는 이벤트 처리기를 만들때에는 반드시 public을 사용해야 한다.

<Program.cs>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
 
namespace ConsoleApp3
{   
    internal class Program
    {        
        static void Main(string[] args)
        {
            Connection myConnection = new Connection();
            Display myDisplay = new Display();
 
            myConnection.MessageArrived += new MessageHandler(myDisplay.DisplayMessage); 
            // 이벤트 이름과 대리자 형식 이름을 이용해서 이벤트 처리기를 등록한다.
 
            myConnection.Connect();
            Console.ReadLine();
        }
    }
}
cs

<실행화면>

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28