WPF中窗口及窗口上的控件是属于UI线程,可以再后台代码区直接使用控件属性,却不可以不可以再新建一个线程中操作控件,因为控件属于UI线程,你新建一个线程去调用UI线程中的控件属于跨线程访问,WPF默认不能跨线程访问。下面讲解决方法,用到Dispatcher语句
//假设我想通过线程点击一下按钮改变TextBox属性
private void btnSend_Click(object sender, RoutedEventArgs e)
{
//创建并启动线程
ThreadStart ts = new ThreadStart(Method);
Thread td = new Thread(ts);
td.Start();
}
//定义一个方法
public static void Method()
{
//使用Dispatcher语句实现跨线程访问
this.Dispatcher.BeginInvoke((Action)delegate()
{
//括号里些想要使用的控件属性
this.textBox.Text = "Hello";
});
}
这样就可以了,这时又遇到一个问题,这样写太麻烦,不能用一次控件就写一个Dispatcher语句吧,还可以这样写
private void btnSend_Click(object sender, RoutedEventArgs e)
{
//Action是没有返回值的泛型委托
Action action = new Action(Method);
//线程创建启用与Dispatcher语句可以连着写
Thread thread = new Thread((ThreadStart)delegate ()
{
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, action);
});
thread.Start();
//通过封装整个方法,把使用控件的语句都写在方法内,只用使用一次Dispatcher语句就可以了
}
//方法中不需要再Dispatcher了
private void Method()
{
this.txt.Text = "Hello";
}