티스토리 뷰

프로그래밍/C#

다목적 이벤트 처리기

에어버스 2022. 10. 22. 12:09

 

ConsoleApp4.zip
0.01MB

Timer.Elapsed 이벤트 대리자 서명에는 두 개의 매개변수가 있다.

object source - 이벤트를 발생시킨 개체에 대한 참조
ElapsedEventArgs e - 이벤트가 보낸 인수들

이 이벤트나 여러 이벤트들에서 object 형식 매개변수를 사용하는 이유는, 종종 여러 개체들에 의해 발생된 여러 개의 동일한 이벤트들을 하나의 이벤트 처리기로 처리하는 경우에 어떤 개체가 이벤트를 발생시켰는지를 식별할 수 있게 하기 위해서이다.

6행 : 이벤트 처리기가 이벤트를 발생시킨 개별 개체에 대해 약간씩 다른 작업을 처리해야 할 때에는 이벤트 처리기 매개변수 중 하나로 이벤트를 발생시킨 개체를 넘겨받는 방식이 주로 쓰인다.

그리고 System.EventsArgs 를 상속한 클래스에 이벤트에 대한 정보들을 담아서 보내는 방식도 흔히 사용된다.

또한, 이러한 매개변수들은 다형성의 이점도 취할 수 있다. 
Display.cs 에서 MessageArrived 이벤트의 처리기를 정의하고 Connection의 대리자 정의를 
public delegate void MessageHandler(object source, EventArgs e) 로 변경하면 프로그램의 작동 자체는 이전과 동일하겠지만 DisplayMessage() 함수는 좀 더 범용적이 된다. 이제 DisplayMessage() 는 Timer.Elapsed 같은 이벤트들에 대해서도 등록할 수 있다. 물론 그렇게 하려면 전달된 매개변수들을 적절히 처리할 수 있는 코드를 추가해야 할 것이다.

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
// MessageArrivedEventArgs.cs
using System;
 
namespace ConsoleApp4
{
    public class MessageArrivedEventArgs : EventArgs
    {
        private string message;
        public string Message
        {
            get
            {
                return message;
            }
        }
        public MessageArrivedEventArgs()
        {
            message = "No message sent.";
        }
        public MessageArrivedEventArgs(string newMessage)
        {
            message = newMessage;
        }
    }
}
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
37
38
39
40
41
42
43
44
45
46
47
// Connection.cs
using System;
using System.Timers;
 
namespace ConsoleApp4
{
    public delegate void MessageHandler(Connection source, MessageArrivedEventArgs e);
    public class Connection
    {
        public event MessageHandler MessageArrived;
        private string name;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        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, EventArgs e)
        {
            Console.WriteLine("Checking for new message.");
            Random random = new Random();
            if((random.Next(9== 0&& (MessageArrived != null))
            {
                MessageArrived(thisnew MessageArrivedEventArgs("Hello Mum!"));
            }
        }
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Display.cs
using System;
 
namespace ConsoleApp4
{
    public class Display
    {
        public void DisplayMessage(Connection source, MessageArrivedEventArgs e)
        {
            Console.WriteLine("Message arrived from {0}", source.Name);
            Console.WriteLine("Message Text : {0}", e.Message);
        }
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Program.cs
using System;
 
namespace ConsoleApp4
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Connection myConnection1 = new Connection();
            myConnection1.Name = "First connection.";
            Connection myConnection2 = new Connection();
            myConnection2.Name = "Second connection.";
            Display myDisplay = new Display();
            myConnection1.MessageArrived += new MessageHandler(myDisplay.DisplayMessage);
            myConnection2.MessageArrived += new MessageHandler(myDisplay.DisplayMessage);
            myConnection1.Connect();
            myConnection2.Connect();
            Console.ReadLine();
        }
    }
}
cs

 

<실행화면>

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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