C#线程中安全访问控件(重用委托,避免繁复的delegate,Invoke)总结

从硬件到软件:TSMaster报文过滤全链路配置指南(含同星设备适配) 本文详细介绍了TSMaster平台下CAN/LIN/FlexRay总线的报文过滤全链路配置指南,特别针对同星TC1016等硬件的兼容性进行实战演示。从硬件层预过滤到软件层可编程过滤,提供五维过滤体系构建方法,帮助工程师提升车载诊断与总线分析效率。重点解析混合总线过滤策略优化及诊断场景下的特殊过滤方案。 阅读详情

来自:http://www.cnblogs.com/slyzly/articles/2121436.html

1.第一种,不安全,当线程过多后,timer控件和线程中同时访问窗体控件时,有时会出现界面重绘出错。

public frmMain()
 {
     InitializeComponent();
     System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls =false;
 }

2.避免繁复的delegate,Invoke,推荐

复制代码
public static class ControlCrossThreadCalls
{
    public delegate void InvokeHandler();

    ///<summary>
    /// 线程安全访问控件,扩展方法 .net 3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke
    /// this.SafeInvoke(() =>
    /// {
    ///     tsStatus.Text = one.Email + " 开始任务....";
    /// });
    ///</summary>
    //public static void SafeInvoke(this Control control, InvokeHandler handler)
    //{
    //    if (control.InvokeRequired)
    //    {
    //        control.Invoke(handler);
    //    }
    //    else
    //    {
    //        handler();
    //    }
    //}

    ///<summary>
    /// .net2.0线程安全访问扩展方法///</summary>
    /// ControlCrossThreadCalls.SafeInvoke(this.tsStatus, new ControlCrossThreadCalls.InvokeHandler(delegate()
    /// {
    ///    tsStatus.Text = one.Email + " 开始任务...";
    /// }));
    public static void SafeInvoke(Control control, InvokeHandler handler)
    {
        if (control.InvokeRequired)
        {
            control.Invoke(handler);
        }
        else
        {
            handler();
        }
    }
}
复制代码

 

更正一个我发现的C#多线程安全访问控件普遍存在的问题,仅供参考,在网上搜索多线程访问控件,发现很多都是这种类似的写法

http://msdn.microsoft.com/zh-cn/library/ms171728.aspx

复制代码
    private void SetText(string text)
    {
        // InvokeRequired required compares the thread ID of the
        // calling thread to the thread ID of the creating thread.
        // If these threads are different, it returns true.
        if (this.textBox1.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            this.textBox1.Text = text;
        }
    }
复制代码

注意红色部分,这样写几个线程同时操作时问题不是很大,但是当我几10个几100个线程频繁操作时,就出现了System.OutOfMemoryException这个异常,猜测可能是线程堵塞,同时造成cpu很高,内存成倍增长。


嵌入式工程师成长之路(5)——板子调试 USB2514集线器调试总结说说USB连接线USB数据线上的“疙瘩”:原来有这么大用处! 阅读详情

相关推荐

Lumerical FDTD新手教程:5步搞定MMI波导光谱模拟(附避坑指南)

本文提供Lumerical FDTD新手教程,详细讲解5步完成MMI波导光谱模拟的实用方法,包括环境准备、结构建模、光源配置、仿真优化和结果分析。特别针对多模干涉耦合器(MMI)的模拟难点,提供避坑指南和优化策略,帮助光学工程师快速掌握FDTD仿真技术。

kite3的博客 359

Winform --使用DeleGate对不同界面间数据进行交互

Winform --使用DeleGate对不同界面间数据进行交互。

weixin_44119674的博客 304

顶刊《会计研究》数据复现|最新上市公司数智化数据

本文基于Python文本分析方法构建了中国A股上市公司数智化指标(1991-2024),通过识别年报中的"机器学习""智能医疗"等关键词,量化企业数字化与智能化融合程度。研究发现数智化企业更倾向于非正式渠道的定性披露以规避风险,该指标为监管完善信披规则提供了参考。研究还揭示了数智化对企业信息披露策略的转变,并提出了未来研究方向,包括数智化对绿色创新、ESG表现等影响机制。数据覆盖非金融类上市公司,采用文本挖掘技术构建结构化指标,为相关领域研究提供了微观基础。

PPdata_Academy的博客 1487

C# 使用过程中用到的语法

语法总结: 1、SafeInvoke

lanshahewu的博客 434

2023年全国职业院校技能大赛高职组“区块链技术应用”赛项赛卷(3卷)解析

我们先绘制题组中所有设计图我这边作图用的国内的在线作图工具。

2301_76737000的博客 5420

内存预取黑科技:__builtin_prefetch在数据库和游戏开发中的高阶用法

本文深入探讨了GCC内置函数`__builtin_prefetch`在数据库和游戏开发中的高阶应用。通过LevelDB的SSTable文件读取优化和UE5引擎场景数据流式加载的实战案例,详细解析了预取参数调优的艺术,并借助perf工具量化分析了不同策略的性能提升效果。文章还介绍了与`__builtin_expect`等内置函数的协同优化技巧,帮助开发者最大化缓存命中率。

weixin_29019241的博客 417

C# winfrom跟新界面

C# 更新UI 异步

weixin_42774407的博客 874

【报错解决】OpenClaw 报错 `openclaw: command not found`:全局命令未加入系统 PATH 的深度排查与修复指南

在国产AI工具链开发中,OpenClaw作为关键命令行工具常出现command not found报错。本文深度分析该问题的根源——Linux环境变量PATH未包含用户级安装目录(~/.local/bin)。通过四种解决方案(临时PATH修改、永久配置、软链接、虚拟环境处理)和排错Checklist,揭示"命令存在却找不到"的本质是路径配置问题,特别适用于Docker/国产Linux/非root环境。文中强调理解Linux工具链机制对国产AI开发的重要性,并指出这是开发者掌握环境

博客 5383

.NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)

1、错误的代码是: usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespace...

weixin_34384681的博客 132

KingSCADA3.8保姆级安装教程

大家好,我是雷工!最近开始学习KingSCADA,今天这篇详细记录安装KingSCADA3.8的过程。首先下载需要的安装版本,此处以从官网下载的最新版本KingSCADA3.8为例,双击:Setup.exe;

做有价值的事,积累有价值的笔记! 1万+

彻底解决Win11锁屏界面黑屏或者图片不变化

windows锁屏后黑屏

renkai721的专栏 1万+

.NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke

1,错误的代码是: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms...

gtts 227

数学建模学习(120):使用Python实现基于AHP的供应商选择分析

使用Python实现基于AHP的供应商选择分析

全栈川川 913

百度网盘SVIP+B站季卡捆绑套餐,值不值?拆解边际成本与权益开启率

会员经济的本质是持续付费换取服务权益,但捆绑套餐往往隐藏“边际成本”陷阱。在百度网盘SVIP与B站季度大会员组合中,用户常因标价锚定而忽略真实使用率。从权益开启率出发,SVIP属于工具型付费,解决限速、转存等高频痛点;B站季卡属于内容订阅,价值取决于完整观看时长。拆解套餐价格,计算边际成本,再对照近30天被限速次数和追番片单,才能判断“划算”与否。订阅管理还需注意自动续费、到账周期和周期错配。适合刚需网盘且偶尔追剧的用户,低频用户应避免为沉睡权益预付账单。最终,理性决策比促销页面更重要。

weixin_30765577的博客 555

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C#中Invoke的用法()

invoke和begininvoke 区别 一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些新的认识和理解。 首先说下,invoke和begininvoke的使用有两种情况: 1. control中的invoke、begininvoke。 2. delegrate中的invoke、begininvoke。 这两种情况是不同的,我们这里要讲的是第1种。下面我们在来说下.NET中对invoke和begininvoke的官...

m0_61744647的博客 697

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C# 读取大文本出现System.OutOfMemoryException,两种解决方案

问题:读取一个444M的文本文件,出现内存溢出 方案1:利用FileStream将数据读取到byte数组中,然后按区间遍历该byte数组; 优缺点:速度快,占系统内存 可能出现的问题:一个汉字是两个字节,按区间读取转换成字符串,就有可能把一个汉字拆成两半,导致乱码; 解决思路:获取区间数组中最后一个换行符(\n的byte字节),以此为分界点,该换行符以后的数据,留给下一个区间来组装; 代码: /// <summary> /// 通过给定的文件流,判断文件的编码类型 /// &.

PLA12147111的博客 9104

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

c#内存溢出异常 “System.OutOfMemoryException”类型的错误

private void button1_Click(object sender, EventArgs e) { var count = 0; var smallBlocks = new List<byte[]>(); var smallBlockSize = 90000 ; ...

netyou的专栏 1万+

.Net内存泄露原因及解决办法

.Net内存泄露原因及解决办法   1.    什么是.Net内存泄露 (1).NET 应用程序中的内存 您大概已经知道,.NET 应用程序中要使用多种类型的内存,包括:堆栈、非托管堆和托管堆。这里我们需要简单回顾一下。 以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。 在运行库的控制下执行的代码称作托管代码。相反,在运行库之外运行的代码称作非托管代码...

weixin_33946020的博客 678

C# 跨线程调用TextBox方法浅析

 首先来看下面代码:   主线程: delegate void SetTextCallback(string text);   private void SetText(string text)   {   if (this.textBox1.InvokeRequired)   {   SetTextCallback d = new SetTextCallback(SetT

站在巨人的肩膀上 4304

C#利用Invoke和委托实现子线程更新UI(方式1)

UI布局如下 委托定义如下: public delegate void GetStringDelegate(TextBox textBox); From1的代码如下: public partial class Form1 : Form { SetMessageDelegate setMessageDelegate = null; public Form1() { InitializeComponent.

zxy13826134783的博客 2567
上一篇: c#发邮件显示友好发件人方法
下一篇: HashSet 、 Dictionary 、List性能对比
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值