刚学C#,用博客的形式把自己的学习心得记录下来,这是我的第一篇文章,哈哈,如果有什么问题,可以指出。
前段时间写了一个串口收发的C#窗体应用程序,因为串口收发是在后台运行的,所以开了一个线程专门用于收发,建立线程的语句如下:
private Thread mWorkThread;
mWorkThread = new Thread(new ThreadStart(ThreadCalc));
mWorkThread.IsBackground = true;
mWorkThread.Start();
ThreadCalc函数是后台的执行函数,如下:
private void ThreadCalc()
{
while (true)
{
if (m_nSetLed == 1)
{
this.Invoke(new DelegateLED(SetOrResetLED), true);//使用引用的方法,后台线程也将等待引用的方法执行完成
m_nSetLed = 0;
}
...........
if(bNeedRefresh)
this.Invoke(new DelegateRefresh(RefreshLED));
Thread.Sleep(10) ;// (1000);
}
}
DelegateLED和DelegateRefresh是在类中声明的委托,如下:
public delegate void DelegateLED(bool bSet);
public delegate void DelegateRefresh();
其中的函数SetOrResetLED和RefreshLED就是需要访问显示线程中创建的控件的函数,如下:
private void SetOrResetLED(bool bSet) { ............
if(bSet) button1.text="set"; else button1.text="reset";
............ }
private void RefreshLED() {
............ button1.text="reset";
............ } 如果不使用Invoke方法而直接把button1.text=“reset“写入线程ThreadCalc中,则通常会导致不可预知的结果。如果出现编译通不过的情况,可以设置变量CheckForIllegalCrossThreadCalls=false。
我理解的是invoke就像是VC++中的SendMessage。