반응형
안녕하세요 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
반응형
'hayee Study > 코딩_c#' 카테고리의 다른 글
[C#] DataGridview Row 선택 안되도록 하는 방법 (64) | 2023.12.20 |
---|---|
[C#] 메시지박스 (MessageBox) (71) | 2023.12.08 |
[C#] Control 클래스 (1) | 2023.12.01 |
[C#] NaN, PositiveInfinity, NegativeInfinity 필드 처리 방법 (75) | 2023.11.27 |
[C#] 자료형에 대한 기록 (int, Float, Double 등) (47) | 2023.11.23 |