三种青年解决“跨线程访问窗口问题”的方法

最常见的情况就是把其它线程的文字加到listbox,总结了三种写法,由繁到简

1.普通青年:声明委托,调用委托,委托里调方法


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

delegate void AddListItemHandler(string
str);

private void SetText
(string obj)

 {

            if (this.listBox1.InvokeRequired)

            {

                this.listBox1.Invoke(new AddListItemHandler(this.AddListItem),obj);              

            }

            else

            {

                this.listBox1.Items.Add(obj);

            }

 }

private void AddListItem
(string str)

{

  this.listBox1.Items.Add(str);

}

2.文艺青年:用Action


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

private void SetText
(string obj)

{

    if (this.listBox1.InvokeRequired)

    {

    this.Invoke(new Action<string>(this.AddListItem),obj);

    }

    else

    {

        this.listBox1.Items.Add(obj);

    }

}

private void AddListItem
(string str)

{

    this.listBox1.Items.Add(str);

}

3.二逼青年:Action+Lambda,最简略,最优美


1

2

3

4

5

6

7

8

9

10

11

12

13

private void SetText
(string obj)

{

    if (this.listBox1.InvokeRequired)

    {

        this.Invoke(new Action<string>((x)
=> 
this.listBox1.Items.Add(x)),
obj);

    }

    else

    {

        this.listBox1.Items.Add(obj);

    }

}

时间: 2024-08-01 23:01:32

三种青年解决“跨线程访问窗口问题”的方法的相关文章

c#使用MethodInvoker解决跨线程访问控件

功能函数测试集锦(77)  C#专区(114)  版权声明:本文为博主原创文章,未经博主允许不得转载. .net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,有一种方法是禁止编译器对跨线程访问作检查,Control.CheckForIllegalCrossThreadCalls = false;可以实现访问,但是出不出错不敢保证C#跨线程访问控件运行时错误. 使用MethodInvoker即可解决: 原代码: private void btnOK_Click(object sender

跨线程访问控件的方法

主窗体创建的控件相当于主线程管理,在分线程使用的时候会产生跨线程访问的问题,这时需要如下判断写法,即可解决 if (lblNum2.InvokeRequired) { lblNum2.Invoke(new Action<string>(s => { this.lblNum2.Text = s; }), Thread.CurrentThread.ManagedThreadId.ToString()); } else { this.lblNum2.Text = Guid.NewGuid().

C#WinForm解决跨线程访问控件属性报错

方式一(在程序初始化构造函数中加一行代码): 1 public Form1() 2 { 3 InitializeComponent(); 4 Control.CheckForIllegalCrossThreadCalls = false; //设置不捕获线程异常 5 } 方式二(推荐): 1 private void btnLoop_Click(object sender, EventArgs e) 2 { 3 Thread thread = new Thread(()=> { 4 while

C#跨线程访问

原文地址:http://www.cnblogs.com/TankXiao/p/3348292.html C# 跨线程调用控件 在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应.  同时我们又需要在工作线程中更新UI界面上的控件, 下面介绍几种常用的方法 阅读目录 线程间操作无效 第一种办法:禁止编译器对跨线程访问做检查 第二种办法: 使用delegate和invoke来从其他线程中调用控件 第三种办法: 使用delegate和BeginInvoke来从其他线程中控

关于Winform中控件的跨线程访问

闲着没事想起来用winform做一个随机的抽号程序,咋看来这么个东西其实并不难,不过对于一个菜鸟来说其实并不简单!尤其是对于多线程不是特别熟悉的新手来说. 首先,界面比较简单winform,(图片上传好麻烦~~!) 既然是随机抽取号码,就得有随机数(其实关键不在这里,图省事就random了) 可是在用到多线程的时候问题就出现了: 无法跨线程访问label控件,无法修改label的text. 网上找了很多资料,感觉例子搞得难以理解,遂自己撸起.... 1.有人这么写: // Control.Che

C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它

C# 委托 / 跨线程访问UI /  线程间操作无效: 从不是创建控件"Form1"的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; usi

解决跨域访问

解决跨域访问的方法 1.用响应头 response.setHeader("Access-Control-Allow-Origin","*");//允许哪些服务器访问 response.setHeader("Access-Control-Allow-Methods","GET POST");//允许的提交方式 2.使用代理 3.JSONP 原理:通过JavaScript标签来访问服务器,并接受服务器返回的数据来实现跨域访问 js

2 跨线程访问控件InvokeHelper类

这里是一张动画,演示在多线程(无限循环+Thread.Sleep)情况下主界面操作不受影响. 多线程是一种提高程序运行效率和性能的常用技术.随着我们学习工作的深入,在编程中或多或少会涉及到需要多线程的情况.多数时候,我们的操作模式是后台线程中处理数据,计算结果,然后在前台界面(GUI)中更新显示. 在.NET Framework中,为了保证线程安全,避免出现访问竞争等问题,是不允许跨线程访问窗体控件的.如果强行访问,则会引发InvalidOperationException无效操作异常,如下图:

08===跨线程访问之随机点名系统。

3.进程:Process ->方法:1.获取操作系统进程:Process.GetProcess() 2.开始应用程序: Process.Start("程序名","要打开的文件"); 打开网页地址:Process.Start("iexplore.ext","htttp://www.baidu.com"); 3.当程序不是全局类型的时候,程序名要加路径. 4.实例方法:.Thread();.Kill(); 4.线程:Thre