C#里使用最简单的线程调用界面更新的方法

news/2024/9/28 18:08:12/

在C#的界面应用里,经常会遇到线程里计算得到的数据,要更新到界面上。

但是线程与界面线程一般不是同一个线程,不能直接调用更新,需要采用委托的方式来更新。

意思就是说,要线程把数据定义更新的方法之后,把指针发送给界面线程来执行。

要实现这样的功能有很多种写法,但是最简单的写法就是采用委托delegate。

它支持下面这样的写法:

delegate 运算符创建一个可以转换为委托类型的匿名方法。 匿名方法可以转换为 System.Action 和 System.Func<TResult> 等类型,用作许多方法的参数。


Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(3, 4));  // output: 7

 备注

lambda 表达式提供了一种更简洁和富有表现力的方式来创建匿名函数。 使用 => 运算符构造 Lambda 表达式:


Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 4));  // output: 7

有关 lambda 表达式功能的更多信息(例如,如何捕获外部变量),请参阅 lambda 表达式。

使用 delegate 运算符时,可以省略参数列表。 如果这样做,可以将创建的匿名方法转换为具有任何参数列表的委托类型,如以下示例所示:

Action greet = delegate { Console.WriteLine("Hello!"); };
greet();

Action<int, double> introduce = delegate { Console.WriteLine("This is world!"); };
introduce(42, 2.7);

// Output:
// Hello!
// This is world!
这是 lambda 表达式不支持的匿名方法的唯一功能。 在所有其他情况下,lambda 表达式是编写内联代码的首选方法。 可以使用弃元指定该方法未使用的两个或更多个匿名方法输入参数:


Func<int, int, int> constant = delegate (int _, int _) { return 42; };
Console.WriteLine(constant(3, 4));  // output: 42

为实现向后兼容性,如果只有一个参数名为 _,则将 _ 视为匿名方法中该参数的名称。

可以在匿名方法的声明中使用 static 修饰符:


Func<int, int, int> sum = static delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(10, 4));  // output: 14

静态匿名方法无法从封闭范围捕获局部变量或实例状态。

还可以使用 delegate 关键字声明委托类型。

从 C# 11 开始,编译器可以缓存从方法组转换创建的委托对象。 请考虑以下方法:


static void StaticFunction() { }
将方法组分配给委托时,编译器将缓存委托:


Action a = StaticFunction;
在 C# 11 之前,需要使用 lambda 表达式来重复使用单个委托对象:

Action a = () => StaticFunction();

例子:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WindowsFormsApp4
{public partial class Form1 : Form{private Thread myThread;public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){myThread = new Thread(new ThreadStart(ThreadFunction));myThread.Start();}private void ThreadFunction(){Invoke((Action)delegate{label1.Text = "使用最简单的委托方式";});}}
}

这样写是最简单的方式了。


http://www.ppmy.cn/news/1531593.html

相关文章

前端框架对比与选择概述

在快速迭代的Web开发领域,前端框架作为构建现代Web应用的基石,扮演着至关重要的角色。它们提供了丰富的组件、高效的性能优化、以及强大的生态系统,帮助开发者快速搭建高质量、可维护的Web应用。本文将对当前流行的几个前端框架进行对比分析,并给出选择框架时的一些建议。 …

leetcode621. 任务调度器

给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表&#xff0c;用字母 A 到 Z 表示&#xff0c;以及一个冷却时间 n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成&#xff0c;但有一个限制&#xff1a;两个 相同种类 的任务之间必须有长度为 n 的冷却时…

C++学习笔记(39)

307、Linux 的时间操作 UNIX 操作系统根据计算机产生的年代把 1970 年 1 月 1 日作为 UNIX 的纪元时间&#xff0c;1970 年 1 月 1 日是时间的中间点&#xff0c;将从 1970 年 1 月 1 日起经过的秒数用一个整数存放。 一、time_t 别名 time_t 用于表示时间类型&#xff0c;它是…

力扣题解2516

大家好&#xff0c;欢迎来到无限大的频道 今天继续给大家带来每日一题 题目描述&#xff08;中等&#xff09;&#xff1a; 每种字符至少取k个 给你一个由字符 ‘a’、‘b’、‘c’ 组成的字符串 s 和一个非负整数 k 。每分钟&#xff0c;你可以选择取走 s 最左侧 还是 最右…

DAY80服务攻防-中间件安全HW2023-WPS 分析WeblogicJettyJenkinsCVE

知识点 1、中间件-Jetty-CVE&信息泄漏 2、中间件-Jenkins-CVE&RCE执行 3、中间件-Weblogic-CVE&反序列化&RCE 4、应用WPS-HW2023-RCE&复现&上线CS 中间件-Jetty-CVE&信息泄漏 Jetty是一个开源的servlet容器&#xff0c;它为基于Java的Web容器…

vscode 的terminal 输出打印行数限制设置

修改 VSCODE 的 settings.json文件 "terminal.integrated.scrollback": 100000, {"extensions.ignoreRecommendations": true,"workbench.colorTheme": "Monokai","explorer.confirmDelete": false,"editor.fontSize…

自动化测试实例:Web登录功能性测试(无验证码)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是自动化测试 把人为驱动的测试行为转化为机器执行的一种过程称为自动化测试。(来自百度百科)本质上来说&#xff0c;自动化测试对比起手工测试除了需要…

Linux云计算 |【第四阶段】PROJECT2-DAY2

综合项目内容&#xff1a; 升级网站运行平台、部署Redis内存存储服务集群、数据迁移、部署PXCMySQL实现强同步、部署LB和HA集群 一、项目拓扑结构 PROJECT2-DAY1回顾&#xff1a; 服务架构缺点分析&#xff1a; ① 数据存储结构存在单点故障&#xff08;需增调度器&#xff0…