InvokeRequired与Invoke_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > InvokeRequired与Invoke

InvokeRequired与Invoke

 2017/12/4 21:15:10  Yulong5759  程序员俱乐部  我要评论(0)
  • 摘要:在多线程应用中将会涉及不同的线程访问同一控件的问题,C#中禁止跨线程直接访问控件。某个控件在被创建时就记下了是谁创建了它,即它的创建线程。如果从另一个线程调用该控件,那么必须使用控件的Invoke方法来将调用封送现在调用它的线程。(Invoke方法是控件的方法)到底是哪个线程要使用该控件呢?需要用InvokeRequired来询问一下,如果当前调用线程不是控件的创建线程,则为true;否则为false。例子:代码段前提是lb是一个label控件,在主线程创建(不用了解具体在哪个线程
  • 标签:

在多线程应用中将会涉及不同的线程访问同一控件的问题,C#中禁止跨线程直接访问控件。某个控件在被创建时就记下了是谁创建了它,即它的创建线程。如果从另一个线程调用该控件,那么必须使用控件的 Invoke 方法来将调用封送现在调用它的线程。(Invoke方法是控件的方法)

到底是哪个线程要使用该控件呢?需要用InvokeRequired来询问一下,如果当前调用线程不是控件的创建线程,则为 true;否则为 false。

例子

代码段前提是lb是一个label控件,在主线程创建(不用了解具体在哪个线程,反正和RunTimer不在一个线程),RunTimer方法是在另一个线程创建,这时候我们需要RunTimer方法调用主线程上的label控件。

  private delegate void RunTimeDelegate();
        private void RunTime()
        {
            if (lb.InvokeRequired)
            {
                RunTimeDelegate d = RunTime;
                lb.Invoke(d);//Invoke方法是控件的,这里相当于把RunTime方法交于了委托d,
                //d中相当于把RunTimer方法从线程中提取出来放到委托中,此时控件的Invoke方法就可以
                 //    调用委托中的和RunTimer相同方法,这样控件使用RunTimer方法就在控件的线程中使用的。
            }
            else
            {
                time = endTime - TimeSpan.Parse(DateTime.Now.ToString("HH:mm:ss"));
                lb.Text = time.ToString();
            }

        }

 

上一篇: Spring Boot与RabbitMQ结合实现延迟队列 下一篇: 没有下一篇了!
  • 相关文章
发表评论
用户名: 匿名