• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
搬运工_阿壮
博客园    首页    新随笔    联系   管理    订阅  订阅

控件的invoke和beginInvoke方法

System.Windows.Forms.Timer 的timer是在主线程上执行的,因此在timer的tick事件中操作界面上的控件不会发生线程的安全性检测。

Control的invoke和begininvoke方法的比较:

 invoke方法:使用Invoke完成一个委托方法的封送,就类似于使用SendMessage方法来给界面线程发送消息,是一个同步方法。

复制代码
private delegate void InvokeDelegate();

private void InvokeMethod()

{    //C代码段 }

private void butInvoke_Click(object sender, EventArgs e)

{   

 //A代码段.......   

 this.Invoke(new InvokeDelegate(InvokeMethod));  

  //B代码段......

}
复制代码

invoke执行的顺序是A->C->B

beginInvoke异步方法。

复制代码
Control的BeginInvoke private delegate void BeginInvokeDelegate();

 private void BeginInvokeMethod()

{   

//C代码段

}

 private void butBeginInvoke_Click(object sender, EventArgs e)

{   

 //A代码段.......   

 this.BeginInvoke(new BeginInvokeDelegate(BeginInvokeMethod));   

 //B代码段......

}
复制代码

begininvoke执行的顺序是A->B->C

下面列出几种control的invoke方法使用:

1) Action的lambda方法的使用

Control.invoke(new Action(()=>{.....;}));

 

复制代码
  new Thread(() =>
            {
                while (true)
                {
                    label1.BeginInvoke(new MethodInvoker(() => { label1.Text = System.DateTime.Now.ToString(); }));
                    Thread.Sleep(1000);
                }
            }) { IsBackground = true }.Start();
复制代码

 

2)实例委托

复制代码
private delegate void ChangeTxt();
     void time_Elapsed(object sender,System.Timers.ElapsedEventArgs e)
        {
            ChangeTxt changetxtDelegate=new ChangeTxt(change);
            textBox1.Invoke(changetxtDelegate);
//或者直接textBox1.Invoke(new ChangeTxt(change));

}

private void change() { textBox1.Text = (a++).ToString(); }
复制代码

3)传参数

复制代码
 private delegate void showtest(string text);
 private void run()
        {
            showtest st = new showtest(show);
            for (int i = 0; i < 100000; i++)
            {
                textBox1.Invoke(st, i.ToString());
            }
        }
void show(string test)
        {
            textBox1.Text = test;
        }
posted @ 2019-10-11 11:50  搬运工_阿壮  阅读(639)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3