C#中Invoke,BeginInvoke的作用
-
Control.Invoke 和 Control.BeginInvoke
实例1.利用 控件中的Invoke 和 BeginInvoke 方法
作用1:在线程中执行访问和修改UI内容
作用2:Invoke可以阻塞线程,等待UI操作返回
作用3:BeginInvoke不阻塞线程,后台刷新UI,提高程序的流畅性
public partial class fmMain : Form
{
public fmMain ()
{
InitializeComponent();
}
public void ThreadRun()
{
while (true)
{
Thread.Sleep(1);
this.Invoke(new Action(() =>
{
MessageBox.Show("show");
// 在该this(Form)控件的线程中执行Action中的委托
// 你可以在此获取UI变量 或者 改变UI变量
// 但是 ThreadRun线程会被阻塞 等待 Action 执行完成
}));
this.BeginInvoke(new Action(() =>
{
MessageBox.Show("show");
// 在该this(Form)控件的线程中执行Action中的委托
// 你可以在此获取UI变量 或者 改变UI变量
// 但是 ThreadRun线程不会被阻塞继续向下执行
}));
}
}
}
-
Action 等delegate 中Invoke和BeginInvoke的作用
实例2.
作用1.Invoke在当前函数中立即执行,相当于直接调用该Action所注册的所有函数,阻塞当前函数帧
作用2.BeginInvoke在当前函数帧中开辟这个线程去执行Action所注册的函数,不阻塞当前函数帧
作用3.BeginInvoke 中有2额外两个参数 (arg1 回调委托,任意参数)用于beginInvoke完成后,执行该某些动作,
注意 结束完回调的函数 所在线程 为调用beginInvoke 的线程
public Action<string> ShowMsg;
public void Test()
{
// 在当前函数所在线程中执行,当前函数线程阻塞
ShowMsg += (str) => { Debug.WriteLine(str); };
ShowMsg.Invoke("hello wrold");
// 开辟一个线程执行 hello wrold,当前函数线程不阻塞
ShowMsg.BeginInvoke("hello wrold", null, null);
// AsyncCallback 回调委托
// IAsyncResult 异步执行的结果,可以自我继承,添加自定义参数 用于显示异步执行的状态
// index(object类型) 外部传参,存储在IAsyncResult.AsyncState中
AsyncCallback asyncCallback = ar => { Debug.WriteLine($"beginInvoke 执行完成 回调{ ar.AsyncState}"); };
int index = 0;
ShowMsg.BeginInvoke("hello wrold", asyncCallback, index);
}