VB.NET 在线程里用textbox,提示 线程间操作无效: 从不是创建控件“TextBox2”的线程访问它

来自:    更新日期:早些时候
VB.NET问题 线程间操作无效~

想简单点的话不需要委托,窗体启动的时候,加上
CheckForIllegalCrossThreadCalls = False即可

背景:winform(vs2010)前台界面上有2个group(group1,group2),每个group上面有一些lable用于显示后台查询出来的数据,后台3个线程A,B,CA线程每隔几秒查询数据库,并把查询出来的数据更新到group1上的lable上(定义),B线程每隔几秒查询数据库,并把查询出来的数据更新到group2上的lable上,通过一个辅助线程计算出的一个值赋给textBox1.text;
1.直接在窗体的构造函数中添加:
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
此时禁用了所有的控件合法性检查。
2.通过代理来解决(msdn)
private delegate void SetTextCallback(string text); //在给textBox1.text赋值的地方调用以下方法即可 private void SetText(string text) { // InvokeRequired需要比较调用线程ID和创建线程ID // 如果它们不相同则返回true if (this.textBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.textBox1.Text = text; } }
这里主要用到了.NET中的 delegate。
另外如果线程AB只负责将数据保存在全局变量里,用一个有操作权限的C(主界面搞个timer)调用这些数据并显示在界面上就没问题了。

 比如在一个窗体中的代码如下,在另一个线程中显示,隐藏窗口线程中的进度条:  

     Public Delegate Sub VoidDelegate() '定义委托类型
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim th1 As New System.Threading.Thread(AddressOf MyThreadProc) '声明线程
        th1.Start() '启动线程运行 MyThreadProc过程
    End Sub
    Public Sub MyThreadProc() 
        Me.Invoke(New VoidDelegate(AddressOf StartProgress)) '这个是在另一个线程里调用StartProgress过程,并在创建窗口的那个线程里运行。参数是委托类型。me也可以改成控件名。如果直接调用 StartProgress,那该过程就在与MyThreadProc同一线程中运行,那么StartProgress过程中修改的控件不是在本线程创建的,就会出错。
       '。。。。。。。。。
        Me.Invoke(New VoidDelegate(AddressOf ShutProgress))
    End Sub
    Public Sub ShutProgress()
        ProgressBar1.Visible = False
   End Sub
    Public Sub StartProgress()
        ProgressBar1.Visible = True
    End Sub

'不是还有个Process控件吗,好像也是用来多线程操作的,还没研究,



在form_load事件中加上下面一句就好:
CheckForIllegalCrossThreadCalls = False '不进行跨线程检查,


VB.NET 在线程里用textbox,提示 线程间操作无效: 从不是创建控件“TextBox2”的线程访问它视频

相关评论:

相关主题精彩

版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

Copyright © 喜物网