본문 바로가기

프로그램

C# 크로스 스레딩 문제 - 다른 스레드가 이개체를 소유하고 있어 호출한 스레드가 해당 개체에 액세스 할 수 없는 문제


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

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

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


  • * 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();
                    });
               

'프로그램' 카테고리의 다른 글

c# 중복실행방지 모음  (0) 2011.08.25
AutoResetEvent  (0) 2011.08.23
C# RS-232 설정관련  (0) 2011.04.08
13주차  (0) 2009.06.01
12주차  (0) 2009.05.26