<>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” 方法来更新控件。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信