C#中Invoke,BeginInvoke的作用

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

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值