<>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
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信