Winform或者WPF中创建UI线程,不像MFC中有CWinThread。C#中创建线程就直接一个Thread。其实说到底还是工作线程与UI线程的区别。可以简单的这么说,若线程能够处理窗口资源,则为UI线程,否则为工作线程。所谓处理窗口资源,说到底就是处理窗口的消息队列。MFC中的线程有个消息循环:
MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
同理,C#的UI线程也应该有一个消息循环。应用在创建的时候,主线程会默认创建一个消息队列用以处理控件消息。但普通的工作线程创建,则不具备消息队列。C#的线程创建如下:
Thread m=new Thread(new ThreadStart(threadfunc));
m.Start();
void threadfunc()
{
}
假设我们在threadfunc中创建一个窗口:
void threadfunc() { Window a=new Window(); a.Dispacher.Invoke(DispatcherPriority.Normal, (Action)delegate() { a.Show(); }); }
a可以显示,但之后要更新窗口的状态,就不行了。这是因为线程没有消息队列。如何为创建的线程添加消息队列呢?.net架构提供了接口System.Windows.Threading.Dispatcher.Run();
void threadfunc()
{
Window a=new Window();
a.Dispacher.Invoke(DispatcherPriority.Normal, (Action)delegate() { a.Show(); });
System.Windows.Threading.Dispatcher.Run();
}
若你在Run()后面多添加一个语句,打上断点,你就会发现,执行到Run()之后,就不再执行下一句了。那么我们可以合理猜测,Run()里创建了消息循环。同时,我们可以发现,之后窗口就能够处理控件的状态更新了。