728x90
반응형
728x170
■ MethodInvoker 대리자를 사용해 InvokeRequired 코드 패턴을 자동화하는 방법을 보여준다.
▶ ControlExtension.cs
namespace TestProject;
/// <summary>
/// 컨트롤 확장
/// </summary>
public static class ControlExtension
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 필요시 호출하기 - InvokeIfRequired(control, methodInvoker)
/// <summary>
/// 필요시 호출하기
/// </summary>
/// <param name="control">컨트롤</param>
/// <param name="methodInvoker">메소드 호출자</param>
public static void InvokeIfRequired(this Control control, MethodInvoker methodInvoker)
{
if(control.InvokeRequired)
{
control.Invoke(methodInvoker);
}
else
{
methodInvoker();
}
}
#endregion
}
▶ MainForm.cs
namespace TestProject
{
/// <summary>
/// 메인 폼
/// </summary>
public partial class MainForm : Form
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainForm()
/// <summary>
/// 생성자
/// </summary>
public MainForm()
{
InitializeComponent();
this.runButton.Click += runButton_Click;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
//////////////////////////////////////////////////////////////////////////////// Event
#region 실행 버튼 클릭시 처리하기 - runButton_Click(sender, e)
/// <summary>
/// 실행 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void runButton_Click(object sender, EventArgs e)
{
Button button = sender as Button;
button.Enabled = false;
Thread thread = new Thread(new ThreadStart(ProcessThread));
thread.Start();
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Function
#region 스레드 처리하기 - ProcessThread()
/// <summary>
/// 스레드 처리하기
/// </summary>
private void ProcessThread()
{
for(int i = 0; i < 10; i++)
{
this.InvokeIfRequired(() => { this.messageLabel.Text = (i + 1).ToString(); });
Thread.Sleep(500);
}
this.InvokeIfRequired
(
() =>
{
this.messageLabel.Text = string.Empty;
this.runButton.Enabled = true;
}
);
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > WinForm' 카테고리의 다른 글
[C#/WINFORM/.NET6] 마우스 이벤트 발생시키기 (0) | 2022.10.22 |
---|---|
[C#/WINFORM/.NET6] Point 구조체 : 선의 왼쪽 포인트 여부 구하기 (0) | 2022.10.19 |
[C#/WINFORM/.NET6] 별점(Star Rating) 그리기 (0) | 2022.10.14 |
[C#/WINFORM/.NET6] 비주얼 스튜디오 2022에서 단일 실행 파일 배포하기 (0) | 2022.10.10 |
[C#/WINFORM/.NET6] ISynchronizeInvoke 인터페이스 : InvokeRequired 코드 패턴 자동화하기 (0) | 2022.10.09 |
[C#/WINFORM/.NET6] 화면 돋보기 사용하기 (0) | 2022.10.09 |
[C#/WINFORM/.NET6] TextBox 클래스 : Multiline 속성이 False일 때 ENTER 키 누르는 경우 알림 소리 방지하기 (0) | 2022.10.07 |
[C#/WINFORM/.NET6] Control 클래스 : 컨트롤 페인팅 보류하기/재개하기 (0) | 2022.10.07 |
[C#/WINFORM/.NET6] Control 클래스 : 컨트롤 페인팅 보류하기/재개하기 (WIN32 API 함수 사용) (0) | 2022.10.07 |
[C#/WINFORM] WebView2 클래스 사용하기 (0) | 2022.10.03 |
댓글을 달아 주세요