Silverlight 跨线程访问无效
此错误在子线程访问UI线程的时候出现,
原因分析:
在silverlight/wpf中只有创建 DispatcherObject 的线程才能访问该对象。例如,一个从主 UI 线程派生的后台线程不能更新在该 UI 线程上创建的内容
例如
private void button1_Click(object sender, RoutedEventArgs e) { System.Threading.Thread thread=new System.Threading.Thread(()=>{ ((Button)sender).Content = "Hello"; }); thread.Start(); }
解决办法有以下几种
1使用 SynchronizationContext;
此方法需要注意的是,System.Threading.SynchronizationContext.Current必须在UI线程中调用,如果在子线程中,将返回null;
private void button1_Click(object sender, RoutedEventArgs e) { System.Threading.SynchronizationContext sc = System.Threading.SynchronizationContext.Current; System.Threading.Thread thread=new System.Threading.Thread(()=>{ sc.Post((o) => { ((Button)sender).Content = "Hello"; }, null); }); thread.Start(); }
2 使用Dispatcher.BeginInvoke方法private void button1_Click(object sender, RoutedEventArgs e) { System.Threading.Thread thread=new System.Threading.Thread(()=>{ this.Dispatcher.BeginInvoke(() => { ((Button)sender).Content = "Hello"; }); }); thread.Start(); }
3 使用BackgroundWorker 类来代替你的线程类
版权声明:本文原创发表于 博客园,作者为 imbob,博客 http://imbob.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。