본문 바로가기
개발언어/.NET

C# delegate 사용법 - 사례3

by 공장장코난 2019. 12. 25.

Window Application 타 Server로부터 Push Message를 받기 위해 Socket Class library를 작성중이다. 
예전에 nsoftware사의 DotNetFramework 기반의 상용 모듈을 사용한 경험이 있어 비슷하게 구현할 생각인데
Socket Client/Server Module을 Class Library로 작성해 Recv된 데이터는 delegate를 이용해 받을 대상
원도우로 전달할 생각이다. 

 

 

우선 Class Library에 MainWindow에 전달할 delegate event 생성한다.
...
#region Event Delegates
public delegate void OnCurTimeEventHandler(object sender, EvtArgs e);
#endregion

public class BkgrndTimer
{
    #region 속성
    DispatcherTimer objTicker = new DispatcherTimer();
    #endregion

    #region 이벤트
    public event OnCurTimeEventHandler OnCurTimeEvent;
    #endregion

    public void BeginTicker()
    {
        objTicker.Interval = TimeSpan.FromSeconds(1);
        objTicker.Tick += new EventHandler(OnTimeTick_EventHandler);
        objTicker.Start();
    }

    public void EndTicker()
    {
        objTicker.Stop();
        objTicker.IsEnabled = false;
    }

    private void OnTimeTick_EventHandler(object sender, EventArgs e)
    {
        objTicker.Stop();

        string sCurTime = string.Format("{0:0000}-{1:00}-{2:00} {3:00}:{4:00}:{5:00}",
                                                  DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day,
                                                  DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);

        OnCurTimeEvent(this, new EvtArgs(sCurTime));

        objTicker.Start();
    }
}

public class EvtArgs
{
    public string sCURTIME;

    public EvtArgs(string sCurTime)
    {
        sCURTIME = sCurTime;
    }
}

생성된 delegate event는 MainWindow에서 아래와 같이 받았다.

public partial class MainForm : Form
{
    #region 속성
    private BkgrndTimer.BkgrndTimer objBkgrndTimer = new BkgrndTimer.BkgrndTimer();
    #endregion

    public MainForm()
    {
        InitializeComponent();
    }

    private void MainForm_Load(object sender, EventArgs e)
    {
        objBkgrndTimer.OnCurTimeEvent += new BkgrndTimer.OnCurTimeEventHandler(OnBkgrndEvent_Handler);
        objBkgrndTimer.BeginTicker();
    }

    private void OnBkgrndEvent_Handler(object sender, BkgrndTimer.EvtArgs e)
    {
        this.lbCurTime.Text = e.sCURTIME;
    }

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        objBkgrndTimer.OnCurTimeEvent -= new BkgrndTimer.OnCurTimeEventHandler(OnBkgrndEvent_Handler);
     }
}

예제는 Class Library에서 DispatcherTimer를 이용한 현재 시간을 MainWindow에 전달한 것이지만 이 개념을 바탕으로
작성했다. 다시 작업 시작...