윈폼 컨트롤 사용시 타 쓰레드에서 컨트롤 변경호출시 컨트롤의 InvokeRequired 확인하고 처리하는 코드가 너저분해지기 마련입니다.
이런 류 코드는 많이 쓰일 것 같은데...
간단히 이렇게도 가능하지만,
textBox1.Invoke( new Action (() => { textBox1.Text = count.ToString(); } ));
좀 더 효율적으로 동작하기 위한 방법들을 찾아보았습니다.
아래 링크에 좋은 의견들이 많았습니다.
그 중 깔끔하게 사용하는 방법을 옮겨 포스팅합니다.
WinForm.cs (아래처럼 활용하시면 됩니다.)
-----------------------------------------------------------
//메인쓰레드가 아닌 다른 쓰레드에서 UI 변경 호출시 label1.RunOnUIThread(control => { control.Text = $"{progressCount}/{totalCount}";; });
다음 확장메소드를 선언합니다.
ControlExtension.cs
----------------------------------------------------------------------------
using System.ComponentModel; namespace RxTestWinForm { public static class ControlExtension { /// <summary> /// T Type의 Delegate 선언 /// </summary> /// <typeparam name="T">T타입</typeparam> /// <param name="obj">Invoke 할 컨트롤 </param> public delegate void RunOnUIThreadDelegate<T>(T obj) where T : ISynchronizeInvoke; /// <summary> /// ISynchoronizeInvoke 인터페이스 구현체 대한 RunOnUIThread확장 메소드 /// </summary> /// <typeparam name="T">T타입, 캐스팅을 피하기 위해 사용</typeparam> /// <param name="obj">메소드 확장할 컨트롤</param> /// <param name="action">수행할 Action</param> public static void RunOnUIThread<T>(this T obj, RunOnUIThreadDelegate<T> action) where T : ISynchronizeInvoke { if (obj.InvokeRequired) { obj.Invoke(action, new object[] { obj }); } else { action(obj); } } } }
'C#' 카테고리의 다른 글
WPF MVVM 샘플코드 (0) | 2018.05.28 |
---|---|
doxygen 설치 및 설정 (0) | 2018.05.14 |
간단한 한글 단어 세기 프로그램 공개 (6) | 2018.03.02 |
IIS7 환경에서 WEBAPI 프로젝트 구동 오류시 (0) | 2017.11.17 |
닷넷으로 CNTK 돌려보기 (0) | 2017.10.24 |