본문 바로가기

hayee Study/코딩_c#

[C#] delegate (델리게이트)

반응형

안녕하세요 hayee 입니다.

 

Delegate 란 대리자라고 부르며 매서드를 매개변수로 전달할 수 있고, 콜백함수로도 사용이 됩니다.


▷ 예제 소스 (1)

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        delegate void UpdateRichTextboxCallback(string text);

        public Form1()
        {
            InitializeComponent();
        }

        public void UpdateText(string msg)
        {
            string DataMsg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff: ") + msg;

            // 다른 스레드에서 RichTextBox 컨트롤에 접근할 경우 비동기적으로 컨트롤에 전달한다. 
            if (InvokeRequired)
            {
                object[] pList = { DataMsg };
                richTextBox.BeginInvoke(new UpdateRichTextboxCallback(OnUpdateRichTextBox), pList);
            }
            else
            {
                OnUpdateRichTextBox(DataMsg);
            }
        }

        private void OnUpdateRichTextBox(string msg)
        {
            richTextBox.AppendText(msg + "\r\n");
            richTextBox.ScrollToCaret();

            if (richTextBox.Lines.Length > 1000)
            {
                richTextBox.Clear();
            }               
        }
    }
}

 

- 해당 예제 소스는 RichTextbox 컨트롤에 문자열을 (string) 추가하는 메소드이다. InvokeRequired 속성을 사용하여 컨트롤이 만들어진 스레드에서 접근했는지를 알 수 있다.

 

- InvokeRequired 속성이 true 일 때는 다른 스레드에서 컨트롤에 접근한다는 뜻으로 비동기적으로 컨트롤에 전달된다.

 

- 다른 스레드에서 바로 접근할 경우 InvalidOperationException 에러 ('크로스 스레드 작업이 잘못되었습니다.') 가 발생하게 된다.

 

 

▷ 예제 소스 (2)

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        delegate void UpdateCallback(object[] param);
        
        public Form1()
        {
            InitializeComponent();
        }

        public void TestFunction(string s1, string s2)
        {
            object[] param = new object[2];

            param[0] = s1;
            param[1] = s2;
            
            if (InvokeRequired)
                BeginInvoke(new UpdateCallback(OnUpdate), param);
            else
                OnUpdate(param);
        }

        private void OnUpdate(object[] param)
        {
            string sText = param[0].ToString();               
        }
    }
}

 

- 델리게이트를 사용하여 여러개의 파라미터를 넘기고 싶을 경우 object 타입의 배열을 이용하는 방법도 있다.

 

 

 

# 틀린 부분이 있다면 댓글 부탁드립니다. #

# 댓글 달아주시면 늦게라도 블로그 방문하도록 할게요! 감사합니다. #

 

728x90
반응형