您的位置:首页 > 移动开发 > Objective-C

线程间操作无效 从不是创建控件“___”的线程访问它”解决方法的疑惑

2010-09-11 20:45 447 查看
解决方法根据网友的资料一般提到了两种,但msdn的帮助提到了三种,有一种但我怎么验证也不行。先说一下经常讨论的两种:
(1)不使用委托:在构造函数或者窗体Load的代码里添加下面一句:
Control.CheckForIllegalCrossThreadCalls = False
(2)委托方法的实现
private delegate void TestDelegate();
private void DelegateMethod(){
////label......
}
private void StartMethod(){
this.Invoke(new TestDelegate(DelegateMethod))
}
private button_click(...){
Thread thread = new Thread(new ThreadStart(StartMethod));
thread.Start();
}
这两种方法都没有问题,但是msdn还有一种即说用backgroundworker组件,这种方法那个例子没问题。
但是在下面这种情况就出问题了:
我通过串口(serialport)接收数据然后更新文本框,利用backgroundworker实现不成功。
描述一下我的程序,
在界面上放个textbox1,serialport1,backgroundworker1,button1,
然后在串口的datarecived中
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
ass1 = Me.SerialPort1.ReadLine()          'ass1为全局变量,接收串口数据,此步没问题
Me.BackgroundWorker1.RunWorkerAsync()    '根据msdn我用BackgroundWorker1在textbox1完成显示
End Sub
'在 BackgroundWorker1_RunWorkerCompleted中
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
TextBox1.Text = "This text was set safely by BackgroundWorker."    '在textbox1中显示接收数据
End Sub

在执行到 TextBox1.Text = "This text was set safely by BackgroundWorker." 时提示“线程间操作无效 从不是创建控件“Textbox1”的线程访问它”。说明BackgroundWorker组件不能实现跨线程访问。
但是在msdn例子里把 Me.BackgroundWorker1.RunWorkerAsync()    放在一个button的click中却可以正确运行,不提示跨线程访问问题。
是不是BackgroundWorker组件不能避免类似上面描述的串口多线程访问的错误??那BackgroundWorker组件其实用在何种场合??
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐