杭州网站建设规划,格尔木建设局网站,百度识图网页版入口,又拍云wordpress1.在WinForms中的Invoke和BeginInvoke
WinForms是一个单线程的UI框架。在多线程的环境下操作UI控件时。需要使用Invoke和BeginInvoke跨线程调起UI线程
这两的区别如下Invoke#xff1a;同步调用#xff0c;当前代码不在UI线程上执行时#xff0c;会卡住当前线程#xff0…1.在WinForms中的Invoke和BeginInvoke
WinForms是一个单线程的UI框架。在多线程的环境下操作UI控件时。需要使用Invoke和BeginInvoke跨线程调起UI线程
这两的区别如下Invoke同步调用当前代码不在UI线程上执行时会卡住当前线程切换到UI线程并等待操作完成后再继续执行
BeginInvoke异步调用它也会将操作切换到UI线程但不会卡住当前线程不会等待操作完成调用线程会立即继续执行
InvokeRequire判断当前的使用控件的操作是否来自非UI线程如果为True则需要用Invoke或者BeginInvoke调起UI线程
示例
private void UpdateLabel(string text)
{if (label1.InvokeRequired){// 使用 Invoke 切换到 UI 线程label1.Invoke(new Actionstring(UpdateLabel), text);}else{label1.Text text; // 主线程可以直接更新}
}2.在委托中使用Invoke和BeginInvoke
Invoke的另一个作用是调用委托。委托本质上是对某些方法的引用地址指向方法所在的内存空间。
Invoke立即执行委托所指向的方法并等待该方法执行完成同步。
BeginInvoke异步调用委托调用后不会等待该方法执行完成而是继续执行代码适用于异步操作。
示例
Actionstring myDelegate (msg) Console.WriteLine(msg);// 使用 Invoke 直接调用委托方法
myDelegate.Invoke(Hello);// 使用 BeginInvoke 异步调用
myDelegate.BeginInvoke(Hello, null, null);3.Invoke作用于事件的触发
示例
public event Action OnSomeEvent;public void TriggerEvent()
{// 如果有事件订阅者使用 Invoke 调用所有订阅者OnSomeEvent?.Invoke();
}4.反射中的Invoke
通过反射(Reflection)来动态调用方法动态调用使用MethondInfo.Invoke()
动态调用类型和方法只有在运行时才知道编译时无法确定其具体的类型和信息直接调用是无法实现的必须通过反射来动态调用
示例
public class MyClass
{public void SayHello(string name){Console.WriteLine($Hello, {name}!);}
}public class Program
{public static void Main(){MyClass obj new MyClass();MethodInfo method typeof(MyClass).GetMethod(SayHello);// 使用 Invoke 通过反射调用方法method.Invoke(obj, new object[] { World });}
}使用场景
使用反射来处理从外部动态加载的类和方法。实现某种依赖注入或插件式架构的框架。编写类似 ORM对象关系映射工具时通过反射获取数据库模型的字段和类型生成对应的 SQL 查询。