c#线程问题:线程间操作无效:从不是创建控件 的线程访问它InvalidOperationException异常

来源:互联网 发布:nba纳什数据 编辑:程序博客网 时间:2024/05/19 00:49

出现    InvalidOperationException异常 及其解决方法

 

问题描述:

 

通常情况下,显示界面(如Winform)的工作是由一个单独的线程完成的,假设它为线程A。

此时,如果有另外一个线程假设名为线程B,线程B想在线程A的界面中显示一行文本信息,这个时候如果线程B直接调用线程A中的显示控件的方法,就有可能会出现InvalidOperationException异常。

如 界面中有一个richtextbox组件,如果在线程B中使用this.richtextbox.AppendText 方法,就会出现异常。

 

 

解决方法:

 

//在Windows From里面,需要在线程里面访问界面元素,需要使用beginInvoke来完成.
Invoke 方法允许同步执行控件上的方法,而 BeginInvoke 方法则初始化异步执行。

要使用这些方法,必须用与将调用的方法相同的签名声明委托。然后,您可以通过向要调用的方法提供适当的委托来调用窗体上任何控件的 Invoke 或 BeginInvoke 方法。任何必需的参数都包装在 Object 中,并被传输到该方法。

 

namespace TestInteractiveThread
{

    public partial class FormMain : Form

    {

        private RichTextBox richTextBox;

      

        public delegate void ShowMessageDelegate( string mess);

        private void ShowMessage( string mess )

        {

          this.richTextBox.AppendText(mess);

        }

        ......

        ......

        ......

        //假如有一个线程B的函数,在函数体里面应该这样让界面显示信息

        this.richTextBox.BeginInvoke( new ShowMessageDelegate(ShowMessage) , new objec[]{ "Message to show" } )

        //new objec[]{ "Message to show" }表示将参数"Message to show"传递给ShowMessage函数

 

 

    }// end for class FormMain

}

 

参考文档:http://hi.baidu.com/dxawddd/blog/item/af1b95e7edc93429b838207c.html “线程间操作无效: 从不是创建控件“progress1”的线程访问它”

原创粉丝点击