WPF中使用Free解决访问非UI线程创建的对象抛出的Thread异常
2013-04-13 11:13
796 查看
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Threading; using System.Windows.Threading; namespace WpfMultiThread { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { class WasImage { public BitmapSource bmp = null; } public MainWindow() { InitializeComponent(); } private double BoodWidth = 0; private void Window_Loaded(object sender, RoutedEventArgs e) { BoodWidth = m_rectBood.Width; } private double counter = 1; private delegate void NormalDelegate(); private WasImage Cal() { WasImage wasImg = new WasImage(); wasImg.bmp = new BitmapImage(new Uri(System.Environment.CurrentDirectory + "\\zz.jpg")); wasImg.bmp.Freeze();//如果没有此步则在UI线程中调用会失败 return wasImg; } private void UpdateUI() { m_rectBood.Width = counter * BoodWidth; //m_tblCounter.Text = counter.ToString(); } private void m_btnStart_Click(object sender, RoutedEventArgs e) { //异步任务封装在一个delegate中, 此delegate将运行在后台线程 Func<WasImage> asyncAction = this.Cal; //在UI线程中得到异步任务的返回值,并更新UI //必须在UI线程中执行 Action<IAsyncResult> resultHandler = delegate(IAsyncResult asyncResult) { WasImage wasImage = asyncAction.EndInvoke(asyncResult); m_imgtest.Source = wasImage.bmp; }; //异步任务执行完毕后的callback, 此callback运行在后台线程上. //此callback会异步调用resultHandler来处理异步任务的返回值. AsyncCallback asyncActionCallback = delegate(IAsyncResult asyncResult) { this.Dispatcher.BeginInvoke(DispatcherPriority.Background, resultHandler, asyncResult); }; //在UI线程中开始异步任务, //asyncAction(后台线程), asyncActionCallback(后台线程)和resultHandler(UI线程) //将被依次执行 asyncAction.BeginInvoke(asyncActionCallback, null); //NormalDelegate calDele = new NormalDelegate(Cal); //calDele.BeginInvoke(null, null); } private void m_btnInvoke_Click(object sender, RoutedEventArgs e) { //m_imgtest.Source = (this.Tag as WasImage).bmp; } } }
相关文章推荐
- 正在创建模型,此时不可使用上下文“的解决办法。 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。请注意不
- EF(Entity Framework)发生错误”正在创建模型,此时不可使用上下文“的解决办法。 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。请注意不保证 DbContext 的实例成员和相关类是线程安全的。 临时解决了这个问题,在Context的构造函数中,禁用了自动初始化:
- 解决“线程间操作无效: 从不是创建控件的线程访问它” 非使用线程非安全操作
- c#中使用多线程访问winform中控件的若干问题 解决线程间操作无效: 从不是创建控件的线程访问它
- WPF调用线程 解决“调用线程无法访问此对象,因为另一个线程拥有该对象“问题
- EF异常‘在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。 请注意不保证 DbContext 的实例成员’
- WPF调用线程 解决“调用线程无法访问此对象,因为另一个线程拥有该对象“问题
- WPF中调用线程无法访问此对象,因为另一个线程拥有该对象 的解决方法
- 一个解决在非UI线程中访问UI 异常的小方法
- 用了invoke还是出错的解决方法.wpf 调用线程无法访问此对象,因为另一个线程拥有该对象。
- Java访问DotNet平台WCF服务,使用自定义对象如IDictionary做参数时,抛出"Did not understand MustUnderstand"异常
- WPF异常:调用线程无法访问此对象,因为另一个线程拥有该对象。
- 解决多线程操作控件时可能出现的异常:“在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级”
- “线程间操作无效: 从不是创建控件的线程访问它”的解决措施及delegate的用法
- 线程间操作无效: 从不是创建控件“”的线程访问它的解决方法
- 使用SSM创建项目后,无法访问静态资源,报404错误解决办法
- qt数据库多线程问题的解决(QSqlDatabase 同一个连接只能在创建它的线程中使用)
- Android异步机制一:使用Thread+Handler实现非UI线程更新UI界面
- JAVA中创建线程对象的两种方法:继承Thread和实现Runable
- 学习pthreads,使用属性对象创建结合线程和分离线程