欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C#中Invoke,BeginInvoke的作用

程序员文章站 2022-06-10 16:33:56
...

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);
        }