티스토리 뷰
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(this, new 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 |
<실행화면>