C#/수업 내용

Event와 delegate

Game Client Lee Hwanguk 2023. 2. 24. 17:59
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
//Event (delegate)
namespace LearnEvent
{
    class Notifier
    {
        public class MessageEventArgs : EventArgs //EventArgs상속
        {
            public int UserId { get; set; }
            public string Message { get; set; }
            public string Time { get; set; }    
        }
        public event EventHandler<MessageEventArgs> messageEventHandler; //이벤트 변수

        public void Init()
        {
            //메세지가 오면 이벤트를 발생시킴
            for(int i=0; i<1000; i++) {
                Thread.Sleep(1000); //m/sec 단위
                //이벤트 발생
                var userId = 100; //누가?
                var message = "hellow world"; //무엇을?
                var time=DateTime.Now.ToString("yyyy-MM-dd HH-mm:ss"); //언제?
                
                //개체 이니셜라이즈
                var args=new MessageEventArgs() { 
                    UserId=userId, 
                    Message = message,
                    Time=time 
                };
                this.messageEventHandler(this, args);
            }
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            new Program();
        }

        //생성자
        public Program() { 
            Notifier notifier= new Notifier();
            //구독(program이 notifier의 상태를)
            notifier.messageEventHandler += this.MessageEventHandler;

            notifier.Init();
        }


        //sender:이벤트를 발생한 객체 e:이벤트 발생시 전달된 인자 객체
        private void MessageEventHandler(object sender, Notifier.MessageEventArgs e)
        {
            //var args=(Notifier.MessageEventArgs)e;
            Console.WriteLine("sender:{0}",sender);
            Console.WriteLine("e.UserId:{0},e.Message:{1},e.Time:{2}",e.UserId,e.Message,e.Time);
        }
    }
}