跨线程调用界面控件

C#【委托/事件篇】跨线程访问窗体控件的方法 跨线程访问窗体控件的几种方法 阅读详情
开发多线程应用程序时,经常会有这样的需要:后台线程处理数据,完了在前台界面显示,如:
public class Conf
{
    
//用于保存一个多线程共享的数据和全局变量
   static string msg;
}


public class UI
{
    TextBox Msg;
    
//界面类
   
}



public class DataDealer
{
    
//用来处理数据的线程类
    string msg;
}

当DataDealer类数据处理完成后,想在UI中的Msg中输出该怎么办呢?直接访问肯定是不行的
这种情况一般有两种处理方法:
1. Timer
    把DataDealer的msg保存到Conf中,UI通过Timer事件定时从Conf中得到数据显示,这方法简单但是缺点显而易见,就是不够时时。

2. 委托+Invoke
    要想时时处理,只能DataDealer执行完后触发UI显示数据。

    貌似可以这样:
public delegate void Message(string text);
public class Conf
{
    
//用于保存一个多线程共享的数据和全局变量
public static Message ShowMessage;
}


public class UI
{
    TextBox Msg;
    
//界面类
    UI()
    {
        Conf.ShowMessage
=new Message(ShowText);
    }

     
public ShowText(string msg) 
    
{
       Msg.Text
=msg;
    }


}


public class DataDealer
{
    
//用来处理数据的线程类
    string msg;
    
public run()
    
{
       Conf.ShowMessge(msg);
    }

}

如果是单线程的话,上面的方法确实可行。可是在多线程的情况下,一个线程创建的控件,在另外一个线程中是不能直接访问的。怎么办?只能用Invoke调用,麻烦的是DataDealer不是继承自Form类不能调用Invoke方法,最后只能这样:

public delegate void Message(string text);
public class Conf
{
    
//用于保存一个多线程共享的数据和全局变量
public static Message ShowMessage;
}


public class UI
{
    TextBox Msg;

      
Message ShowTxt;
    //界面类
    UI()
    {
        Conf.ShowMessage
=new Message(GetTxt);
           
ShowTxt=new Message(ShowText);
    }
     
public ShowText(string msg) 
    
{
       Msg.Text
=msg;
    }
        
      
public GetTxt(string msg) 
    
{
        Invoke(
ShowTxt, msg);
    }

   

}


public class DataDealer
{
    
//用来处理数据的线程类
    string msg;
    
public run()
    
{
       Conf.ShowMessge(msg);
    }

}

看上去很麻烦吧,不过确实能很好的完成工作。

总结一下:
跨线程调用界面控件需要做两步工作:
1.利用委托进入界面线程 2,利用Invoke触发事件
 
id="LIU_iframe_12" style="border: 0px none ; top: 42px; left: 0px; right: 0px; bottom: 0px; position: absolute; z-index: 13; background-color: white;" src="http://www.m-w.com/cgi-bin/dictionary/text#lookitup"> id="LIU_iframe_0" style="border: 0px none ; top: 42px; left: 0px; right: 0px; bottom: 0px; position: absolute; z-index: 0; background-color: white;" src="http://en.wikipedia.org/w/index.php?lookitup!&title=text&printable=yes&!redir=^/wiki/(.*)|(^.*?title=)(.*?)(&.*)">
C#中跨线程调用的方法一点总结 因此,在C#的Windows Forms和WPF等框架中,跨线程调用UI控件成为了一个重要的课题。如果尝试从另一个线程(非UI线程)直接访问或修改UI控件,将会引发异常或导致不可预测的行为。: 后台线程应该专注于执行耗时任务,并通过某种机制(例如,通过事件、回调或返回值)将结果传递回UI线程,然后由UI线程负责更新UI控件。这两个方法都允许你将一个委托(delegate)排队到UI线程的消息队列中,以便在UI线程上执行。: 将跨线程调用UI控件的逻辑封装在单独的方法中,可以使代码更易于理解和维护。 阅读详情

相关推荐

C#跨线程访问控件

C#跨线程访问控件,用了线程池和Action委托和Control的Invoke方法

12.添加可跨线程调用的函数,为了线程安全

上一节我们添加了线程池,可以把一些比较耗时的任务放到线程池中处理。而我们处理完成后,需要把数据发送给回客户端,而上一节中,是在线程池的某一线程中把消息发送的,不是在IO线程发送。这样是有点问题,首先,这样就会有两个线程去控制该socket(IO线程会监听该socket的读写,而线程池又通过send()函数去调用该socket),这不符合我们的要求的。。那么,我们该怎么解决这个问题呢。

m0_57408211的博客 1298

遥感图像小白--2--图像分割

遥感图像分割基础入门

Mary的博客 4237

跨线程访问控件的操作

1.跨线程操作ui控件时如果需要立刻得到结果用Invoke同步方法如果不需要立刻得到结果可以用BeginInvoke方法2.用Action委托就好MethodInvoker委托不了解不使用。

weixin_54498280的博客 1800

LVGL开发新选择:深度对比NXP GUI Guider与SquareLine Studio,免费版够用吗?

本文深度对比了LVGL开发中两款主流工具NXP GUI Guider与SquareLine Studio的核心差异,包括功能定位、设计能力、代码生成质量和硬件适配等方面。针对不同项目需求,分析了免费版工具的适用性,帮助开发者根据预算和功能需求做出明智选择。特别关注了GUI设计工具在嵌入式开发中的实际应用效果。

weixin_26976635的博客 429

zabbix深度监控之邮件告警、微信群和微信告警

本文详细介绍了Zabbix监控系统实现邮件告警和微信告警的配置方法。邮件告警部分包含QQ和163邮箱的SMTP服务器配置、消息模板设置、告警流程三步骤(媒介配置、触发器动作、用户设置)。微信告警分为两种方式:企业微信群机器人告警(通过webhook实现)和企业微信应用告警(需创建应用并获取API参数)。两种告警方式都提供了完整的配置流程,包括脚本编写、权限设置、消息模板定制等关键步骤,并特别说明了如何使个人微信接收企业微信告警消息。文章还对比了SMTP、POP3、IMAP三种邮件协议的差异及适用场景。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 816

C#跨线程访问控件以及方法

在C#中,如果需要跨线程访问控件或调用方法,通常需要考虑到UI线程和后台线程之间的调度问题。

sunyao1314的博客 2232

Ubuntu零基础入门到精通【4.4讲】:网络、蓝牙、显示器、声音与输入法设置!

🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。 本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。

**My Coding Family** 1486

c# 跨线程访问控件

https://www.cnblogs.com/lvdongjie/p/5428815.html

Sakuya__的博客 4100

Python爬虫:抓取餐饮平台顾客评分与评价的完整教程

本文介绍了如何使用Python爬虫技术抓取餐饮平台上的餐厅评分和评论数据。我们通过三种主要的抓取方法:静态网页抓取(requests)、动态网页抓取(Selenium)和API抓取,展示了如何抓取餐饮平台的数据。还介绍了如何使用pandas对抓取的数据进行存储、清洗、分析,并进行可视化和情感分析。通过本文的学习,您应该能够掌握如何使用Python爬虫抓取餐饮平台的评论数据,并将这些数据应用于市场分析、顾客反馈和服务优化等领域。

2201_76125261的博客 1144

Python 爬虫进阶:淘宝热卖商品价格走势抓取、反爬与分析全流程

在大数据时代,数据是商业决策的重要依据。电商平台上的商品价格走势,对于商家调整经营策略、消费者选择购买时机都有着关键的参考价值。本篇文章将深入解析如何利用 Python 爬虫抓取淘宝热卖商品的价格走势数据,并应对其中的反爬机制,最后对数据进行分析,带领大家领略 Python 爬虫在电商领域的强大应用。

yansideyucsdn的博客 1058

C#中错误:线程间操作无效,从不是创建控件的线程访问它。

一、原因分析 跨线程调用控件会出现这个错误的原因是因为:.NET禁止了跨线程调用控件, 否则谁都可以操作控件,最后可能造成错误。 所以不是在创建控件所在的线程内调用就会发生这样的错误。 二、解决办法 方法1:设置CheckForIllegalCrossThreadCalls =false 是能去掉这个检查的,但是这不是标准的作法. 方法2:定义一个委托(delegate),委托(delegate)可以将参数与方法传递给控件所在的线程,并由控件所在的线程执行,通过Invoke来调用,这样可以完美的..

qq_36818726的博客 2万+

[特殊字符] PetaLinux Qt 程序(WindRadar)无法自动启动问题解决文档

摘要:本文档解决了PetaLinux 2020.1系统中Qt程序(WindRadar)无法开机自动显示界面的问题。通过分析发现,自动启动时缺少DISPLAY=:0.0环境变量导致Qt找不到显示设备。最终在autostart.sh脚本中添加该变量,并完善了字体加载、驱动加载、显示设备检测等流程,确保程序正常自启显示界面。完整脚本包含路径检测、环境配置和错误处理,经验证各项功能均正常运行。

梁俊星的博客 327

c#中如何跨线程调用windows窗体控件?

我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。首先来看传统方法: public partial class Form1 : Form { public Form1() { InitializeComponent();

hanmuxue的专栏 793

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

异步调用和跨线程调用控件

这里用一个简单的例子来演示  "异步调用"  和  "跨线程调用窗口控件" 假设您现在写了一个函数:   public DataTable GetPersonInfo (string personName) {     //这是一个在数据库中找个人信息的方法     //内容怎么写,你喜欢 } 由于  GetPersonInfo  一下子可能会出来很多的结果,

罗汉松驻扎的工作基地 872

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

c#中如何跨线程调用windows控件

<br /><br /><br /> 从程序设计上来说,只有创建界面的主线程才能访问界面上的控件,所以会出错.<br />        当然,设置CheckForIllegalCrossThreadCalls =false 是能去掉这个检查的,但是这不是标准的作法.<br />        标准的作法是在访问界面控件时,访问下窗体的 InvokeRequired 属性,如果为false就可以直接访问,否则就是跨线程访问;此时,创建一个delegate,并通过Invoke() 来调用它.<br />  

lujianfeiccie2009的专栏 1721

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java跨线程间控件的修改_C#-WinForm跨线程修改UI界面的示例

背景在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作。他们会引发软件的卡顿甚至假死,严重影响软件的使用。因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程)与用户间的交互。但多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制。而在Winform中,跨线程修改UI界面同样是不被允许的。在子线程中...

weixin_32176655的博客 310

C# WinForm 跨线程访问控件

在做WinForm应用的时候,大部分情况下都会碰到在线程中访问界面上控件的问题;然而我们并不能用传统方法来访问界面上的控件,c#中禁止跨线程直接访问控件,InvokeRequired就是为了解决这个问题而产生的。         Control.InvokeRequired              获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方

冰蓝 1585

三种方法实现C#Winform跨线程调用

摘要:本文介绍了Winform开发中跨线程访问UI控件的三种解决方法。方法一通过设置Control.CheckForIllegalCrossThreadCalls = false关闭线程调用检查;方法二使用自定义委托,通过Invoke将操作传递给UI线程;方法三利用C#内置的Action委托简化代码。三种方法都能有效解决"线程间操作无效"的异常,其中方法三的new Action写法最为简洁实用。文章通过计数器的具体示例演示了每种方法的实现方式。(149字)

weixin_45837726的博客 865

c#中使用多线程访问winform中控件

我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。    首先来看传统方法:        public partial class Form1 : Form     {          public Form1()         {              InitializeCompo

专注于编程、AI、人工智能等多个领域内容研究和分析 817

C# Winform 线程之间进行操作控件

this.Invoke(new InvokeHandler(delegate () { //操作控件得代码放里面 }));

Little_Code的博客 437

C# 跨线程调用控件

C# 跨线程调用控件 原文: C# 跨线程调用控件 在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应。 同时我们又需要在工作线程中更新UI界面上的控件, 下面介绍几种常用的方法 阅读目录 线程间操作无效第一种办法:禁止编译器对跨线程访问...

weixin_30677617的博客 66

async/await简化多线程调用主界面控件方法

async/await简化多线程调用主界面控件方法 1.C#4.0的做法 C#4.0调用多线程多为Task操作,一般将耗时的工作交给后端线程去做,主线程只需要保持数据更新就行了。后端线程无法直接控制主界面的线程,一般是通过调用主界面的句柄,Invoke/BeginInvoke这两个方法,一个同步,一个异步方法。这样会导致很多不方便的地方。这里展示一个示例: private void btn_Click(object sender, EventArgs e) {

weixin_43988887的博客 525

InvokeHelper,让跨线程访问/修改主界面控件不再麻烦(转)

http://bbs.youkuaiyun.com/topics/390162519 事实上,本文内容很简单且浅显,所以取消前戏,直接开始。。源代码:在本文最后这里是一张动画,演示在多线程(无限循环+Thread.Sleep)情况下主界面操作不受影响。多线程是一种提高程序运行效率和性能的常用技术。随着我们学习工作的深入,在编程中或多或少会涉及到需要多线程的情况。多数时候,我们的操作模式是后台...

weixin_30448603的博客 179

c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。...

首先来看传统方法: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArg...

weixin_30807677的博客 176
上一篇: 网站发布前应该注意的事
dreambroken
博客等级 码龄25年 8粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值