728x90
반응형

Winform을 이용해서 프로젝트를 많이 수행하는 편은 아니다보니, 그때 그때 필요한 사항을 찾아서 개발하곤 합니다. 

가급적 테스트 툴을 개발하는 목적으로 많이 사용하다보니, 사용성은 적은데요.

그러다 보면, 가끔 List View를 이용해서 Log 를 보여줄때 thread 에 영향을 받게 되는 경우가 발생합니다.


msdn 에 검색해 보니, 아래 링크 검색이 되서 공유합니다. 

 


 

 

docs.microsoft.com/ko-kr/dotnet/desktop/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls?view=netframeworkdesktop-4.8

 

스레드로부터 안전한 컨트롤 호출 - Windows Forms .NET Framework

스레드로부터 안전한 방식으로 크로스 스레드 컨트롤을 호출 하 여 앱에서 다중 스레딩을 구현 하는 방법에 대해 알아봅니다.

docs.microsoft.com

 

사용방법

저는 주로 delegate를 이용해서 Log를 찍는 방법을 선호합니다. 

public partial class MainForm : Form
{
    private delegate void SafeUpdateText(string text);
    public MainForm()
    {
        InitializeComponent();
    }
       
}

MainForm Class 에 SafeUpdateText delegate 선언해 줍니다. 

 

 

 

public void UpdateMessage(string msg)
{
    if (RichTxt_ReceiveMsg.InvokeRequired)
    {
        var d = new SafeUpdateText(UpdateMessage);
        RichTxt_ReceiveMsg.Invoke(d, new object[] { msg });
    }
    else
    {
        RichTxt_ReceiveMsg.AppendText(msg + "\r\n");
    }
}

실질적으로 작업을 수행하는 UpdateMessage 메소드에서, 

InvokeRequired 메소드는, 컨트롤의 스레드 ID와 호출하는 스레드 ID를 비교하는 속성을 쿼리하는 메소입니다. 

이를 이용해서 ID가 다를 경우, 기본스레드에서 대리자를 사용해 메서드를 호출하는 방식입니다. 

 

 

 

 

WinForm 의 경우 UI thread를 사용하고 있으니, 

위 방법을 이용하면 좋을 듯 합니다. 

728x90

+ Recent posts