본문 바로가기
[ Program ]/C#

c# 크로스쓰레딩 - 다른쓰레드의 컨트롤 값변경

by 관이119 2015. 7. 22.

 

 

출처 - http://www.soulfree.net/734

 

 

휴우... 제목이 엄청길다.
내 블로그 이외에도 이 내용으로 많은 자료가 이미 많이 올라와있지만
프로그램 할때마다 필요한데 내 머리는 외워주지를 않아서 결국 포스팅 해버리게 되었다.... 매번 소스찾기가 귀찮아서.ㅠㅠ

이 코드가 필요한 경우를 예를 들면,
데이터를 송수신 하는 다중 스레드 프로그램이 있는데
데이터를 수신하는 스레드에서 프로그램 화면을 갱신하려고 하면 바로 이 글 제목같은 문제가 발생한다.
그래서 대리자를 통하여 스레드간의 자원을 공유할 수 있도록 해주어야 한다.
간단한 코드이지만 이상하게도 외어지지가 않는다ㅠㅠ

코드 설명을 하고자 쓰는 글이 아닌지라... 혹시 설명이 필요하신 분은 댓글 달아주시길...


  • * WPF의 경우의 예

    using System.Windows.Threading;    //using을 먼저 해주고...

    ...

    public delegate void ThisDelegate();   //클래스의 맴버 변수로 delegate  선언만 해둔다..

    public partial class Window1 : Window
    {
    ...

    reader.Dispatcher.Invoke(DispatcherPriority.Normal, (ThisDelegate)delegate()
                {
                    box.Stroke = Brushes.Black;
                });


  • 일반 Windows Form 응용프로그램의 예

    if (this.textBox_log.InvokeRequired)
                {
                    this.textBox_log.Invoke((MethodInvoker)delegate
                    {
                        this.textBox_log.Text += DateTime.Now.ToString() + " : " + msg + "\r\n";
                        this.textBox_log.SelectionStart = this.textBox_log.TextLength;
                        this.textBox_log.ScrollToCaret();
                    });

댓글