• 控件的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;
            }
  • 相关阅读:
    STM32位带操作
    url参数 加密
    object.key 对象的键排序 可能出现的问题
    在vue项目中 获取容器的高度
    navigator 判断移动端是Android还是iOS
    Nginx下载地址
    Sublime Text3快捷键大全
    鼠标拖着元素飞
    g6 cavans
    vue img标签图片加载时 闪烁
  • 原文地址:https://www.cnblogs.com/wwwbdabc/p/11653295.html
Copyright © 2020-2023  润新知