[WPF] WPF에서 Control 접근시 CrossThread 피하기


winform과 달리 invoke Require를 체크하는것이 따로 없다.
그리고 Dispatcher 로 스레드 문제를 피할수 있다.

 
using System;
using System.Windows;
using System.Windows.Threading;
using System.Threading;

namespace UFWallControler
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            //시스템타이머로 다른 스레드 생성
            System.Timers.Timer timer1 = new System.Timers.Timer(1000);
            timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed1);
            timer1.Start();

            //wpf 타이머로 같은 스레드에서 실행 
            DispatcherTimer t = new DispatcherTimer();
            t.Interval = new TimeSpan(0, 0, 1);
            t.Tick += new EventHandler(t_Tick);
            t.Start();
        }

        void t_Tick(object sender, EventArgs e)
        {
            SafeThreadTextBox("timer call");
        }

        void timer_Elapsed1(object sender, System.Timers.ElapsedEventArgs e)
        {
            SafeThreadTextBox("timer call");
        }

        void SafeThreadTextBox(string s)
        {
            //
            //만약 서로의 스레드가 같다면
            //winform의 invokeRequre테스트
            //
            if (Thread.CurrentThread == textBox1.Dispatcher.Thread)
            {
                textBox1.Text += "inThread " + s + Environment.NewLine;
            }
            else
            {
                textBox1.Dispatcher.BeginInvoke(
                    new Action(() => textBox1.Text += "outThread " + s + Environment.NewLine 
                ));
            }
        }
    }
}
Yamecoder 야매코더_
C# 2011.02.21 23:47
Powerd by Tistory, designed by criuce
rss