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

C# 委托

Action

在 C# 中,Action 是一个预定义的委托类型,表示一个不带参数和返回值的方法。它的定义如下:

public delegate void Action();

Action 委托可以用于表示任何没有参数和返回值的方法。例如:

// 定义一个不带参数和返回值的方法
public void SayHello()
{
    Console.WriteLine("Hello!");
}

// 使用 Action 委托表示 SayHello 方法
Action action = SayHello;

// 调用委托来执行方法
action(); // 输出:Hello!

如果要表示带有参数的方法,可以使用 Action 委托,其中 T 是方法参数的类型。例如,要表示一个带有一个整数参数的方法,可以使用 Action 委托:

// 定义一个带有一个整数参数的方法
public void PrintNumber(int number)
{
    Console.WriteLine("The number is " + number);
}

// 使用 Action<int> 委托表示 PrintNumber 方法
Action<int> action = PrintNumber;

// 调用委托来执行方法
action(42); // 输出:The number is 42

Action 委托还有一些重载形式,可以用于表示带有多个参数的方法,例如 Action<T1, T2> 表示带有两个参数的方法,Action<T1, T2, T3> 表示带有三个参数的方法,以此类推。

Invoke

在 C# 中,Invoke 是一个非常有用的方法,它用于在 Windows 窗体应用程序中调用控件的方法或属性。Invoke 方法的作用是在正确的线程上执行特定的代码,以确保不会出现线程安全问题。这是因为在 Windows 窗体应用程序中,UI 控件只能在创建它们的线程上访问。

当在不同的线程中调用控件的方法或属性时,就会出现跨线程访问异常。为了避免这种异常,我们可以使用 Invoke 方法,该方法将代码包装在委托中,并将其发送到创建控件的线程。在创建控件的线程中,Invoke 方法会在正确的线程上执行该委托,以便访问控件的方法或属性。

以下是一个示例,演示了如何在 C# 中使用 Invoke 方法来访问控件的属性:

private void UpdateTextBox(string text)
{
    if (textBox1.InvokeRequired)
    {
        textBox1.Invoke(new Action<string>(UpdateTextBox), new object[] { text });
    }
    else
    {
        textBox1.Text = text;
    }
}

在上面的示例中,我们首先检查当前线程是否与创建 textBox1 控件的线程相同。如果不是,我们使用 Invoke 方法将 UpdateTextBox 方法的调用包装在一个 Action 委托中,并将其发送到 textBox1 控件所在的线程。在该线程中,Invoke 方法会在正确的线程上执行 UpdateTextBox 方法的调用,以便访问 textBox1 的 Text 属性。如果当前线程与创建 textBox1 控件的线程相同,则直接访问 textBox1 的 Text 属性。

InvokeRequired

在这段代码中,“InvokeRequired” 是一个属性,它用于检查当前线程是否可以访问 UI 控件 “textBox1”。如果当前线程不是创建该控件的线程,则该属性返回 true,这意味着不能直接访问该控件,因为只有创建控件的线程才有权访问它。

在这种情况下,为了更新文本框的内容,必须使用 “Invoke” 方法来在 UI 线程上执行更新操作。 “Invoke” 方法接受一个委托对象作为参数,该委托对象指定了需要在 UI 线程上执行的操作。在这里,我们将 UpdateTextBox 方法作为委托传递给 Invoke 方法,并传递要更新的文本作为参数。

因此,“InvokeRequired” 属性的作用是检查当前线程是否可以访问 UI 控件,以便在必要时使用 “Invoke” 方法来更新控件。


http://www.kler.cn/a/3045.html

相关文章:

  • python编程环境安装保姆级教程--python-3.7.2pycharm2021.2.3社区版
  • Python学习之旅:进阶阶段(五)数据结构-双端队列(collections.deque)
  • 【云安全】云原生-K8S-搭建/安装/部署
  • 在php中怎么打开OpenSSL
  • LangGraph系列-1:用LangGraph构建简单聊天机器人
  • Android 启动流程
  • 【ARCore】Android ARCore 简介 ( AR 增强现实技术简介 | Android 平台常用的 AR 技术 | ARCore 相关资料收集 )
  • 从0到1深度学习环境搭建
  • 你值得拥有——流星雨下的告白(Python实现)
  • 20美刀一个月的ChatGPT架构师,性价比逆天了
  • Vue2 和 Vue3 的对比
  • 2023年ACM竞赛班 2023.3.20题解
  • python之PyQt手把手从入门到吃土
  • 【pytorch源码剖析系列】优化器
  • 论文阅读-Graph Contrastive Learning for Anomaly Detection
  • Alibaba EasyExcel介绍和简单使用
  • 路科验证UVM入门与进阶详解实验2
  • [蓝桥杯] 贪心问题与相关习题详解
  • vue基础知识大全
  • 利用nginx实现动静分离的负载均衡集群实战
  • 第十四届蓝桥杯三月真题刷题训练——第 20 天
  • PDF阅读软件哪个好用?思路提供
  • 【Linux】-- 进程优先级和环境变量
  • 手写一个简单的RPC框架
  • 几种有趣的电路设计(防过压,LLC,PFC,正激和反激电路)
  • CSDN 编程竞赛三十九期题解