C# 实现跨线程操作控件方法是在多线程编程中经常使用的技术。一般情况下,在单独的线程中更新控件的属性或执行某个方法是无法进行的,这时候我们就需要使用一些技术手段来使得控件可以被更好的操纵。下面是实现跨线程操作控件方法的完整攻略:
1.4 异步委托 (Async Method)
异步委托可以使本来需要占用线程等待未知的情况变得可以继续执行,即异步执行。
函数定义
public delegate void AsynInvokeDelegate(string ControlName, string MethodName);
注意:AsynInvokeDelegate 接受两个 string 类型参数: 控件名和方法名。
调用异步委托
private void AsynInvoke(string ControlName, string MethodName) {
this.Invoke(new AsynInvokeDelegate(this.DoInvoke), new object[] { ControlName, MethodName });
}
private void DoInvoke(string ControlName, string MethodName) {
// 在这里调用我们需要异步执行的函数
Control control = (Control)this.GetType().InvokeMember(ControlName, System.Reflection.BindingFlags.GetProperty, null, this, null);
control.GetType().InvokeMember(MethodName, System.Reflection.BindingFlags.InvokeMethod, null, control, null);
}
2.4 窗体异步委托 (Form.Invoke Method)
Form.Invoke Method 是一个方法调用,用于访问并更新控件。该方法在创建控件的线程上下文中执行指定委托,便于跨越线程处理更改。
使用 Form.Invoke Method 需要使用委托来通知控件需要更新。
委托定义
delegate void AsynUpdateUI(string ControlName, string Value);
注意:AsynUpdateUI 接受两个 string 类型参数: 控件名和属性值。
调用异步委托
private void AsynUpdate(string ControlName, string Value) {
if (this.InvokeRequired) {
AsynUpdateUI asynDelegate = new AsynUpdateUI(AsynUpdate);
this.BeginInvoke(asynDelegate, new object[] { ControlName, Value });
} else {
// 进行需要异步处理的操作
Control control = (Control)this.GetType().InvokeMember(ControlName, System.Reflection.BindingFlags.GetProperty, null, this, null);
control.Text = Value;
}
}
以上就是使用异步委托 (Async Method) 和窗体异步委托 (Form.Invoke Method) 实现跨线程操作控件方法的完整攻略。
下面是两条示例说明:
示例一
在窗体上有一个 Label 控件,我们需要在其他线程中更新 Label 的 Text 属性,可以使用以下方法:
private void UpdateLabel(string newText) {
if (this.label1.InvokeRequired) {
this.label1.Invoke(new MethodInvoker(delegate {this.label1.Text = newText;}));
} else {
this.label1.Text = newText;
}
}
示例二
在窗体上有一个 PictureBox 控件和一个 Button 控件,当点击 Button 时,在另一线程中更新 PictureBox 的图片,可以使用以下方法:
private void button1_Click(object sender, EventArgs e) {
Thread t = new Thread(new ThreadStart(delegate {
// 进行图片更新操作
UpdatePicture("http://www.example.com/image.jpg");
}));
t.Start();
}
private void UpdatePicture(string imageURL) {
if (this.pictureBox1.InvokeRequired) {
// 使用窗体异步委托来更新图片
this.BeginInvoke(new AsynUpdateUI(delegate (string ControlName, string Value) {
PictureBox pic = (PictureBox)this.Controls[ControlName];
pic.ImageLocation = Value;
}), new object[] { "pictureBox1", imageURL });
} else {
this.pictureBox1.ImageLocation = imageURL;
}
}
以上两个示例展示了使用异步委托和窗体异步委托来实现跨线程操作控件方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现跨线程操作控件方法 - Python技术站