当前位置:编程学习 > C#/ASP.NET >>

线程间操作无效: 从不是创建控件“label1”的线程访问它。

线程间操作无效: 从不是创建控件“label1”的线程访问它。
label1.Text=clientcommand; --------------------编程问答-------------------- 写上
label1.CheckForIllegalCrossThreadCalls = False
即可
--------------------编程问答-------------------- 我是使用委托的方式 。 可能是老土的方式。 
  void pic_Visible(bool v)
        {
            pic.BeginInvoke(new dpic_Visible(_pic_Visible), v  );
        }
        public delegate void dpic_Visible(bool  v);
        
        void _pic_Visible(bool  v)
        {
          
            pic.Visible = v ;
        }


最后再这样调用     pic_Visible(true);
--------------------编程问答-------------------- CheckForIllegalCrossThreadCalls = false --------------------编程问答-------------------- 跳主先成 使用委托. --------------------编程问答-------------------- 在工作线程是不能操作窗口控件的,这源于。net2.0的一个限制,不能从不是创建控件的线程访问。这时候我们需要使用那个窗口(控件)的Invoke方法来处理。
以下是一段在线程操作控件的代码,中间定义了一个委托。



        delegate void SetValueEventHandler(Label label, string text);
        void SetValueEvent(Label label, string text)
        {
            label.Text = text;
        }

        public void do1()
        {
            for (int i = 0; i < 100000; i++)
            {
                Invoke(new SetValueEventHandler(label1, i.ToString()));
            }
        }
        public void do2()
        {
            for (int i = 0; i < 100000; i++)
            {
                Invoke(new SetValueEventHandler(label1, "aaa" + i.ToString()));
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(do1));
            t.Start();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(do2));
            t.Start();
        } --------------------编程问答--------------------
Invoke(new   SetValueEventHandler(label1,   "aaa "   +   i.ToString())); 
报错,提示应输入方法名;


基于多种数据库多种开发语言的模板化代码代码生成器
目前支持数据库:Access、Oracle、SQL-Server、MySQL和SQLite。 
支持代码类型:asp.net、Asp、Dephi和C# WinForm 

官网:http://www.DevHelper.cn
QQ群:59633049 --------------------编程问答-------------------- 除了委托以外还有没有其它更好的解决方法 --------------------编程问答-------------------- 不知你是开发的什么组件。
不过你这个问题是跨线程操作控件问题,需要判断一下InvokeRequired,贴一段代码参考

    Private Delegate Sub dgShowProgress(sender As Object, e As CopyEventArgs)

Private Sub ShowProgress(sender As Object, e As CopyEventArgs) Handles MyFileOper.PercentChangedEvent
        e.Cancel = blnCancel
        If InvokeRequired Then
            'dgShow = New dgShowProgress(AddressOf ShowProgress)
            BeginInvoke(New dgShowProgress(AddressOf ShowProgress), sender, e)
            Return
        Else
            ProgressBar1.Value = e.PercentValue
            J += 1
        End If
    End Sub

我这个是一个文件复制显示进度表的部分代码,MyFileOper.PercentChangedEvent是在另一个线程发生的,因而处理过程牵扯到界面元素,而操作界面元素应属界面线程,因此InvokeRequired等于True,要用BeginInvoke(New dgShowProgress(AddressOf ShowProgress), sender, e)
这种方式执行此过程更新界面元素(这里是进度条的Value)。 --------------------编程问答-------------------- CheckForIllegalCrossThreadCalls   =   False  --------------------编程问答-------------------- 建议楼主看一下brackgroundworker控件的使用方法 --------------------编程问答-------------------- 用委托 --------------------编程问答-------------------- 只要加上
Control.CheckForIllegalCrossThreadCalls = False
就行了。 --------------------编程问答--------------------

 public partial class Form1 : Form
    {
        /*
         * 界面上有一个button,和一个textbox,点击button1时,开始一个新线程,新线程中有一个方法,从0开始计数
         * 并累加,且将每一个新的数字显示到textbox1中去
         * */
        public Form1()
        {
            InitializeComponent();
        }

        public delegate void SetTextDelegate(int text);

        private void button1_Click(object sender, EventArgs e)
        {
            Thread th = new Thread(new ThreadStart(SetText));
            th.Start();
        }
        private void SetText()
        {
            for (int a=0;a<1000000;a++)
            {
                if (textBox1.InvokeRequired)
                {
                    textBox1.Invoke(new SetTextDelegate(SetTextDo), a);
                }
            }
        }
        public void SetTextDo(int i)
        {
            textBox1.Text = i.ToString();
        }
    }
 #region Windows 窗体设计器生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(13, 23);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(145, 23);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(100, 21);
            this.textBox1.TabIndex = 1;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 262);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

--------------------编程问答--------------------
引用 8 楼  的回复:
不知你是开发的什么组件。
不过你这个问题是跨线程操作控件问题,需要判断一下InvokeRequired,贴一段代码参考

VB.NET code

    Private Delegate Sub dgShowProgress(sender As Object, e As CopyEventArgs)

Private Sub ShowProgress(sender As Objec……



支持,,,, --------------------编程问答-------------------- 各位不好意思,我是来占位的。以后用 --------------------编程问答-------------------- 用委托吧 楼主 --------------------编程问答-------------------- http://blog.csdn.net/xianfajushi/article/details/7609849 --------------------编程问答--------------------
引用 10 楼  的回复:
建议楼主看一下brackgroundworker控件的使用方法


顶!  另外还有timer  --------------------编程问答--------------------
引用 13 楼  的回复:
C# code

 public partial class Form1 : Form
    {
        /*
         * 界面上有一个button,和一个textbox,点击button1时,开始一个新线程,新线程中有一个方法,从0开始计数
         * 并累加,且将每一个新的数字显示到textbox1中去
         * */
        ……

这个不错,搞了一下午,这个对我最有用了,谢谢!!!!
补充:.NET技术 ,  组件/控件开发
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,