silverlight中“跨线程访问无效”错误

来源:互联网 时间:2016-11-26

silverlight中有时候的数据都是通过异步得到的,当得到需要的数据我们之间操作界面的控件,控件的值时候都会出现”跨线程访问无效。”
自定义线程来获取数据,或者对界面操作时候。这时候 UI 线程和自定义线程不是同一个线程 这样都会报错

解决方法如下

 public partial class ChildWindow1 : ChildWindow { System.Threading.Thread t; public ChildWindow1() { InitializeComponent(); this.Loaded += new RoutedEventHandler(ChildWindow1_Loaded); } void ChildWindow1_Loaded(object sender, RoutedEventArgs e) { t = new System.Threading.Thread(WriteY); t.Start(); } private void WriteY() { test((o) => { Dispatcher.BeginInvoke(() => { t = null; CancelButton_Click(null, null); }); }); } private void test(Action<bool> result) { if (true) { result(true); } } private void OKButton_Click(object sender, RoutedEventArgs e) { this.DialogResult = true; } private void CancelButton_Click(object sender, RoutedEventArgs e) { this.DialogResult = false; } }

Dispatcher 维护按优先顺序排列的特定线程的工作项队列。
当 Dispatcher 创建在一个线程,它就会成为唯一 Dispatcher 可与该线程关联即使 Dispatcher 关闭的情况下。
在 WPF, 、 DispatcherObject 只能由访问 Dispatcher 与之关联。 例如,后台线程不能更新的内容 Button 关联 Dispatcher 上 UI 线程。 为了使后台线程访问 Content 属性 Button, ,后台线程必须将工作委托给 Dispatcher 与关联 UI 线程。 这通过使用实现 Invoke 或 BeginInvoke。 Invoke 是同步和 BeginInvoke 是异步的。 该操作将添加到的队列 Dispatcher 指定 DispatcherPriority。

相关阅读:
Top