当前位置: 首页 > article >正文

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

在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.kler.cn/news/325170.html

相关文章:

  • 【蚂蚁HR-注册/登录安全分析报告】
  • 基于大数据技术的颈椎病预防交流与数据分析及可视化系统
  • 【Webpack】优化前端开发环境的热更新效率
  • 上交所系统被股民买崩了?原因竟然是...
  • 宠物智能听诊器科技赋能宠物医疗
  • ad布线的常见错误123
  • JavaScript网站设计案例:如何构建一个交互性强、性能优异的网站
  • win10系统K8S安装教程
  • MYSQL的安装和升级
  • 【unity进阶知识4】封装unity协程工具,避免 GC(垃圾回收)
  • Vue76 编程式路由导航
  • 云手机的默认ip地址是什么
  • (补充)3DMAX初级小白班第三课:创建物体+物体材质编辑
  • gateway--网关
  • 【spring】 -Dlog4j.configurationFile配置log4j2的自定义路径
  • mac Wireshark You do not have permission to capture on device “rvio“.
  • Java 编码系列:集合框架(List、Set、Map 及其常用实现类)
  • 从0到1教你学会写测试总结
  • Emiya 家今天的饭C++
  • 封装axios请求
  • C++ 中是#pragma once
  • cefsharp新版本OnBeforeResourceLoad 禁止http自动跳转https显示404错误解决办法 含代码
  • 在Ubuntu中自动挂载SMB/CIFS共享
  • Springboot2笔记核心技术——1.基础入门
  • Java-数据结构-Map和Set-(二)-哈希表 |ू・ω・` )
  • 第八届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)
  • SQL_having_pandas_filter
  • 天童美语:全国爱牙日|健康护“齿”知识
  • 从0学习React(5)---通过例子体会setState
  • 使用Docker快速本地部署RSSHub结合内网穿透访问RSS订阅源