[C#/WINFORM/.NET6] ISynchronizeInvoke 인터페이스 : InvokeRequired 코드 패턴 자동화하기
C#/WinForm 2022. 10. 9. 23:25728x90
반응형
728x170
■ ISynchronizeInvoke 인터페이스를 사용해 InvokeRequired 코드 패턴을 자동화하는 방법을 보여준다.
▶ SynchronizeInvokeExtension.cs
using System.ComponentModel;
namespace TestProject;
/// <summary>
/// 호출 동기화 확장
/// </summary>
public static class SynchronizeInvokeExtension
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 필요시 호출하기 - InvokeIfRequired<TTarget>(targetObject, action)
/// <summary>
/// 필요시 호출하기
/// </summary>
/// <typeparam name="TTarget">타겟 객체 타입</typeparam>
/// <param name="targetObject">타겟 객체</param>
/// <param name="action">액션</param>
public static void InvokeIfRequired<TTarget>(this TTarget targetObject, Action<TTarget> action) where TTarget : ISynchronizeInvoke
{
if(targetObject.InvokeRequired)
{
targetObject.Invoke(action, new object[] { targetObject });
}
else
{
action(targetObject);
}
}
#endregion
#region 필요시 호출하기 - InvokeIfRequired<TTarget, TResult>(targetObject, function)
/// <summary>
/// 필요시 호출하기
/// </summary>
/// <typeparam name="TTarget">타겟 객체 타입</typeparam>
/// <typeparam name="TResult">결과 타입</typeparam>
/// <param name="targetObject">타겟 객체</param>
/// <param name="function">함수</param>
/// <returns>처리 결과</returns>
public static TResult InvokeIfRequired<TTarget, TResult>(this TTarget targetObject, Func<TTarget, TResult> function) where TTarget : ISynchronizeInvoke
{
return targetObject.InvokeRequired ? (TResult)targetObject.Invoke(function, new object[] { targetObject }) : function(targetObject);
}
#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((form) => { this.messageLabel.Text = (i + 1).ToString(); });
Thread.Sleep(500);
}
this.InvokeIfRequired
(
(form) =>
{
this.messageLabel.Text = string.Empty;
this.runButton.Enabled = true;
}
);
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > WinForm' 카테고리의 다른 글
[C#/WINFORM/.NET6] 이미지 RTF 구하기 (0) | 2022.10.30 |
---|---|
[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] MethodInvoker 대리자 : 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 |
댓글을 달아 주세요