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

ops/2024/10/22 7:56:43/

在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/ops/118972.html

相关文章

git cherry-pick作用

git cherry-pick&#xff0c;它允许你将一个或多个提交&#xff08;commit&#xff09;从一个分支应用到另一个分支上。这个命令特别适用于当你想要将某个分支上的改动单独应用到另一个分支上&#xff0c;而不是合并整个分支。 基本用法 git cherry-pick <commit-hash>…

【论文阅读笔记】TOOD: Task-aligned One-stage Object Detection

论文代码&#xff1a;https://github.com/fcjian/TOOD 文章目录 论文小结论文简介论文方法Task-aligned Head&#xff08;T-Head&#xff09;T-Head伪代码解释 Task Alignment Learning&#xff08;TAL&#xff09;Task-aligned Sample AssignmentTask-aligned Loss 论文实验消…

Redis 性能优化的高频面试题及答案

目录 高频面试题及答案1. 如何选择合适的数据结构以优化 Redis 性能?2. 如何配置 Redis 以优化内存使用?3. 如何使用管道(Pipeline)技术优化 Redis 性能?4. 如何通过数据持久化优化 Redis 性能?5. 如何使用 Redis 的集群模式优化性能?6. 如何通过合理的键命名策略优化 R…

如何只用 CSS 制作网格?

来源&#xff1a;how-to-make-a-grid-like-graph-paper-grid-with-just-css 在看 用于打印到纸张的 CSS 这篇文章时&#xff0c;对其中的网格比较好奇&#xff0c;作者提供了 stackoverflow 的链接&#xff0c;就看到了来源的这个问题和众多回复。本文从里面挑选了一些个人比较…

数据分析师之Excel学习

前言 excel作为职场人来说&#xff0c;已经是人人必备的技能了&#xff0c;所以还不知道这个的小伙伴&#xff0c;一定要抓紧时间学习&#xff0c;紧跟时代的步伐。 Excel 几个重要的版本 97-2003版本是国内最早流行的版本 .xlsx后缀的表格文件&#xff0c;基本是07版本及…

关于Java中的List<User>如何进行深拷贝

联调中发现了一个很初级&#xff0c;但有容易被忽略的拷贝问题&#xff1a; 错误方式&#xff1a;List<User> us new ArrayList<>(); // name "张三"List<User> us1 new ArrayList<>(us);for (User u : us) {...u.setName("douzi&q…

LeetCode讲解篇之53. 最大子数组和

文章目录 题目描述题解思路题解代码 题目描述 题解思路 该问题我们可以转换为求以i为最后一个元素的0 ~ i范围内的最大子数组和&#xff0c;然后其中的所有的最大子数组和的最大值就是我们要返回的答案 题解代码 func maxSubArray(nums []int) int {ans : nums[0]for i : 1;…

JMeter与大模型融合应用之JMeter日志自动检测错误并机器人发送钉钉信息

JMeter与大模型融合应用之JMeter日志自动检测错误并机器人发送钉钉信息 业务框架 我们需要实现的基本业务框架如下 需求描述 我们目前要在JMeter上实现如下功能: 特性1:定时任务自动轮巡检测jmeter.log日志中错在ERROR的报错信息 特性2:针对ERROR报错信息自动进行捕获,…