在多线程应用中将会涉及不同的线程访问同一控件的问题,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(); } }