精华内容
下载资源
问答
  • 主要介绍了C#之WinForm跨线程访问控件,实例讲述了跨线程访问控件的简单实现方法与用法,需要的朋友可以参考下
  • winform跨线程访问控件

    2018-10-30 15:00:00
    首先说下,.net 2.0以后加强了安全机制,不允许在winform中直接跨线程访问控件的属性。所以除了控件所在的线程外的线程调用会抛异常 (Cross-thread operation not valid:Control 'textBox1' accessed from a ...

    首先说下,.net 2.0以后加强了安全机制,不允许在winform中直接跨线程访问控件的属性。所以除了控件所在的线程外的线程调用会抛异常

    (Cross-thread operation not valid:Control 'textBox1' accessed from a thread other than the thread it was created on .)

    下面进入正题:

      第一种方法:

        

    1
    2
    3
    4
    5
    6
    public DomainQuery2()
           {
     
               InitializeComponent();
               System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//设置该属性 为false
           }

      这种方法很方便,但是会有安全问题。

     

      第二种方法:

        

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    private delegate void FlushClient(string a); //代理委托
    //代理赋值方法
    private void TextboxFZ3(string str)
            {
                if (this.textBox3.InvokeRequired)
                {
                    FlushClient fc = new FlushClient(TextboxFZ3);
                    this.Invoke(fc, str); //通过代理调用刷新方法
                }
                else
                {
                    this.textBox3.AppendText(str + "\r\n");
                }
            }
    //这个就是要开启线程的方法  如果要操作控件,必须调用上面的方法
    private void FZ(object obj)  
    {
          TextboxFZ3(obj);
    }
    //点击执行
    private void button1_Click(object sender, EventArgs e)
    {
         Thread thread = new Thread(new ParameterizedThreadStart(SerchInfo));
                thread.IsBackground = true;
                thread.Start(“我是子线程操作的控件赋值”);
    }

        我喜欢先上代码然后解释,第一句:代理委托,当要操作控件的时候做一个判断,如果是子线程要操作,就使用代理委托操作(这里不理解就在赋值方法那里打个断点调试),FZ是具体操作的逻辑。就是这么简单

     

    这两种方法我比较赞同第二种,虽然比第一种方法的代码多,但是相对来说安全性也是有的。

    转载于:https://www.cnblogs.com/asdyzh/p/9876863.html

    展开全文
  • WINFORM跨线程访问控件

    2021-01-13 09:04:52
    //通过跨线程控件赋值 private void btnExecute1_Click(object sender, EventArgs e) { Thread thread = new Thread(() => { for (int i = 0; i < 10; i++) { // this.lblR..
     //通过跨线程给控件赋值
            private void btnExecute1_Click(object sender, EventArgs e)
            {
                Thread thread = new Thread(() =>
                 {
                     for (int i = 0; i < 10; i++)
                     {
                         // this.lblResult1.Text = i.ToString();
                         if (this.lblResult1.InvokeRequired)
                         {
                             this.lblResult1.Invoke(
                                 new Action<string>(data => { this.lblResult1.Text = data; }),
                                 i.ToString()
                                 );
                             Thread.Sleep(300);
                         }
                     }              
                 });
                thread.IsBackground = true;
                thread.Start();
            }

    Invoke方法是执行跨线程访问控件

    https://www.bilibili.com/video/BV1Zf4y117fs?p=9

    展开全文
  • Winform跨线程访问控件

    2019-12-20 08:47:02
    采用以下代码,可以方便的在子线程访问主线程控件 BeginInvoke(new Action(() => { //访问主线程控件的代码 }));

    采用以下代码,可以方便的在子线程中访问主线程控件

    BeginInvoke(new Action(() => { 
     //访问主线程控件的代码
     }));
    展开全文
  • WinForm跨线程访问控件异常 最近做了个WinForm的小项目,遇到个简单的问题记录下。需求:点击”下载“,显示正在下载,下载完后更新状态为”ready“(要求用多线程,避免前台卡死)。 做法 新建一个线程,在新线程中...

    WinForm跨线程访问控件异常

    最近做了个WinForm的小项目,遇到个简单的问题记录下。需求:点击”下载“,显示正在下载,下载完后更新状态为”ready“(要求用多线程,避免前台卡死)。

    做法

    新建一个线程,在新线程中下在更新控件状态,报异常跨线程程访问控件(当然可以通过关闭跨线程访问控件检验解决,不鼓励这么做)。应该C#5.0版本添加的任务Task异步,这里用异步解决。

    Code

    1. 新建WinForm 项目,Form1添加控件如图
      1236909-20171227144327019-879168845.png

    2. 后台代码
        private void button1_Click(object sender, EventArgs e)
            {
                UpdateStatus();
            }
            private void button2_Click(object sender, EventArgs e)
            {
                UpdateStatusThread();
            }
    
            //运行会报异常
            private void UpdateStatusThread()
            {
                Thread th = new Thread(() =>
                {
                    string status = "ready";
                    Thread.Sleep(3000);
                    lbStatus.Text = status;
                });
    
                th.Start();
            }
            private void UpdateStatus()
            {
                new TaskFactory().StartNew(() =>
                {
                    string status = "ready";
                    Thread.Sleep(3000);
                    //将更新控件操作放在其内
                    this.Invoke(new Action(() =>
                    {
                        lbStatus.Text = status;
                    }));
                });
            }

    转载于:https://www.cnblogs.com/LoveTomato/p/8125678.html

    展开全文
  • WinForm跨线程访问控件泛型方法 /// <summary> /// 跨线程访问控件泛型方法 /// </summary> /// <typeparam name="t"></typeparam> /// <param name="cont"></p...
  • C# WinForm 跨线程访问控件 在做WinFrom开发的时候,经常会遇到跨线程访问控件的问题,即从不是创建控件的线程去访问控件。百度里面搜索,会有各种各样的解决方案。在诸多方案中,我认为没有一个方案是特别简单,...
  • .net 2.0以后加强了安全机制,不允许在winform中直接跨线程访问控件的属性,会提示错误“跨线程操作无效“。 提供几种方法解决这个问题 1. 设置CheckForIllegalCrossThreadCalls为False ...
  • 线程访问控件
  • C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它。此时它将会在内部调用newMethodInvoker(LoadGlobalImage)...
  • private void SetAppendTB(Control tb, string str) { if (tb.InvokeRequired)//判断是不是跨线程 true是 false不是 { SetText setText = new SetText(SetAppendTB);//实例化委托对象 Invoke(setText, new object[]...
  • 从其他线程里跨线程拿取UI控件的值   参数 : Control,将要访问控件;propertyName,控件的属性值   使用方式: 见上面的使用案例 III. public static object Get(Control control, object ...
  • 博主刚接触线程没多久,需要实现将线程中计算出的数据传递给winform的label显示出来,但是C#中禁止跨线程直接访问控件,首先想到方法一(用委托实现) : 具体拿一个案例(内部计算已省略)说明:需要实现,按button ...
  • using System; using System.Collections.Generic;... label1.Text = "我在新线程访问这个lable!";  listBox1.Items.Add(label1.Text);  } ;  listBox1.Invoke(CrossDelete);   }   } } 原文参照: ...
  • Winform跨线程操作控件

    2019-09-19 14:24:09
    为了区别是否是创建该控件线程访问控件,Windows窗体控件中的每个控件都有一个InvokeRequired属性,这个属性就是用来检查本控件是否被其他线程调用的属性,当被创建该线程外的线程调用的时候InvokeRequired就为true...
  • 跨线程访问winform控件

    2018-04-03 09:14:26
    跨线程访问winform控件跨线程访问winform控件跨线程访问winform控件
  •  默认情况下.NET Framework不允许在一个线程中直接访问另一个线程中的控件,这是因为如果又两个或多个线程同时访问某一个控件,则可能会迫使该控件进入一种不确定的状态。甚至可能出现不同线程争用控件引起死锁问题...
  • C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件线程访问它”的异常。处理跨线程更新Winform UI控件常用的方法有4种:1. 通过UI线程的...
  • 很多winform开发的新人,在子线程(非UI线程,线程id不为1)要更新控件的text属性时经常会遇到不允许跨线程访问控件的异常:Cross-thread operation not valid. Control “” accessed from a thread other than the...
  • 在多线程操作WinForm窗体上的控件时,出现“线程间操作无效:从不是创建控件XXXX的线程访问它”,那是因为默认情况下,在Windows应用程序中,.NET Framework不允许在一个线程中直接操作另一个线程中的控件(因为访问...
  • 方式一(在程序初始化构造函数中加一行代码): 1 public Form1() 2 { 3 InitializeComponent(); ...4 Control.CheckForIllegalCrossThreadCalls = false; //设置不捕获线程异常 5 } 方式二(推荐...
  • 例如有一个Label控件名为Lbl_Cnt 你通过一个按钮Btn_Start在新线程中对其进行更新,就有可能出现该错误 private void Btn_Start_Click(object sender, EventArgs e) { Task.Run(() => { while (int.TryParse...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 221
精华内容 88
关键字:

winform跨线程访问控件