请问:
  在WinForm的一个线程中创建的窗体和控件如何在另一个线程中访问?
正常情况下,这种设置方式会导致异常产生.谢谢大家了!

解决方案 »

  1.   

    sowenxiong(Sowen) 老兄误解我的意思了:
    情况如下:
      我在主窗口中有一个文本框控件,并启动一个线程在端口上等待,再用收到的内容来更新该
    文本框的内容,但此时如果直接操作的话会引起异常,所以想请教名位有无其它方法来更新文本框中的内容!
      

  2.   

    估计你是VS2005,VS2003是没有这种问题的VS2005首先要启动一个线程,我用VB.Net为例解释所谓的安全线程,原理是一样的
    1、启动线程——声明对应的方法
    MyThread = New Threading.Thread(AddressOf ThreadProcSafe)
    2、方法中调用修改文本的方法,也是为了安全,两个方法没有合并为一个
        Private Sub ThreadProcSafe()
            '安全调用线程
            Dim II As Integer
            For II = 1 To 100000
                Thread.Sleep(1000)
                'LblTime.Text = II & "秒"
                Me.SetText(II & "秒")
            Next
        End Sub
    3、进行安全的更改文本信息,实际上就是多了一步Me.LblTime.InvokeRequired ,判断你处理的控件是否Ok
        Private Sub SetText(ByVal [text] As String)
            If Me.LblTime.InvokeRequired Then
                Dim d As New SetTextCallback(AddressOf SetText)
                Me.Invoke(d, New Object() {[text]})
            Else
                Me.LblTime.Text = [text]
            End If
        End SubInvokeRequired获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。 实际上也并不复杂——就是多出来一步判断而已。
    我不大会C#的写法,大体是应该这样吧,呵呵~~
    private void SetText(string text)
    {
    if (this.LblTime.InvokeRequired)
    {
    SetTextCallback d = new SetTextCallback(SetText);
    this.Invoke(d, new object[] {text});
    }
    else
    {
    this.LblTime.Text = text;
    }
    }
      

  3.   

    忘记一样,需要前面声明一个委托,呵呵~~
    Delegate Sub SetTextCallback(ByVal [text] As String)
      

  4.   

    定上一个全局变量Tmp,在线程里更改这个值然后放一个Timer
    lbTime.Text = Tmp;很土的一个方法-_-#
      

  5.   

    大家早啊,问题已解决,用的是代理,感谢大家的帮助!
    特别感谢lovingkiss说得如此详细!