线程间操作无效: 从不是创建控件“label1”的线程访问它。C#定时器
2013-06-18 17:35
731 查看
线程间操作无效: 从不是创建控件“label1”的线程访问它。(线程异步委托操作:http://www.codeproject.com/Articles/37642/Avoiding-InvokeRequired )
我在使用线程操作winfrom控件对象的时候报错,后来才发现问题所在:多线程中直接调用界面控件的方法是错误的做法,Invoke
和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示
使用委托的时候是使用 Invoke 方法访问主线程程序,实现修改赋值给控件。
//解决无法访问已释放的资源对象 把使用的元素的Parent赋值为null
我在使用线程操作winfrom控件对象的时候报错,后来才发现问题所在:多线程中直接调用界面控件的方法是错误的做法,Invoke
和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示
使用委托的时候是使用 Invoke 方法访问主线程程序,实现修改赋值给控件。
//解决无法访问已释放的资源对象 把使用的元素的Parent赋值为null
//定时器 private void button2_Click(object sender, EventArgs e) { System.Timers.Timer t = new System.Timers.Timer(100);//实例化Timer类,设置间隔时间为10000毫秒; t.Elapsed += new System.Timers.ElapsedEventHandler(theout);//到达时间的时候执行事件; t.AutoReset = true;//设置是执行一次(false)还是一直执行(true); t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件; if (this.IsDisposed) { t.Stop(); } } //定义线程调用的委托 public delegate void SetLabelDelegate(); //定时器实现的方法 public void theout(object source, System.Timers.ElapsedEventArgs e) { Thread th = new Thread(new ThreadStart(SetLab)); th.Start(); } //使用Invoke访问主线程元素 public void SetLab() { if(label1.InvokeRequired) { if (!label1.IsDisposed)//没有被释放,即关闭了窗体 { // 这里会报错,无法访问已释放的对象 请在关闭窗体时加:this.label1.Parent = null; //try //{ label1.Invoke(new SetLabelDelegate(SetLabeDo)); //} //catch (Exception ex) //{ //} } else { } } } //解决无法访问已释放的资源对象 把使用的元素的Parent赋值为null private void Form1_FormClosing(object sender, FormClosingEventArgs e) { this.label1.Parent = null; //解决在 无法访问已释放的对象 }
相关文章推荐
- C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
- 黄聪:BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)
- c# 线程间操作无效: 从不是创建控件“FormMain”的线程访问它
- c#线程问题:线程间操作无效:从不是创建控件 的线程访问它InvalidOperationException异常
- C#线程之间操作无效|不允许访问控件(c# 线程间操作无效: 从不是创建控件“”的线程访问它)
- C#错误---线程间操作无效: 从不是创建控件"Form1"的线程访问它.
- C#中线程间操作无效: 从不是创建控件 txtBOX 的线程访问它
- c#线程问题:线程间操作无效:从不是创建控件 的线程访问它InvalidOperationException异常
- C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
- C# 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~
- BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)
- 线程间操作无效: 从不是创建控件“label1”的线程访问它。
- C#---线程间操作无效: 从不是创建控件“txtreceive”的线程访问它
- 4000 c#关于“线程间操作无效: 从不是创建控件的线程访问它”的问题
- 黄聪:C#“多线程线程间操作无效: 从不是创建控件的线程访问它。”,跨线程修改控件属性解决方案
- c# 线程间操作无效: 从不是创建控件“”的线程访问它,用托管来解决
- C# 线程间操作无效: 从不是创建控件“receivemsg”的线程访问它。
- c# 线程间操作无效: 从不是创建控件“”的线程访问它,用托管来解决
- C#线程间操作无效: 从不是创建控件“dataGridView1”的线程访问它
- c#线程问题:线程间操作无效:从不是创建控件 的线程访问它