了解WPF線程模型的都知道,UI線程負責呈現和管理UI,而UI元素(派生自DispatcherObject)只能由創建該元素的線程來訪問,這就導致了一些耗時的UI操作將影響到整個應用程序性能,未響應及漫長的等待有時會令人抓狂,而UI線程一度成為了不可越逾的鴻溝。
對於框架來說,一個插件的行為不應該影響到其它插件及整個平台的穩定性,後來在看了《Running WPF Application with Multiple UI Threads》和《DispatcherObject與WPF線程模型》兩篇文章後,思維一下子就打開了,前一篇講的是在WPF應用程序中使用多個UI線程,如果每個獨立的插件都處於不同的UI線程,自然性能會有所提升,而後一篇則深入的分析了win32的消息循環和wpf的線程模型,非常透徹。
下面是創建新UI線程的方法
Thread thread = new Thread(() =>
{
Window win = new Window { Title = string.Format("Thread id:{0}", Thread.CurrentThread.ManagedThreadId) };
win.Show();
Dispatcher.Run();
});
thread.IsBackground = true;
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
如此Window將會在新的線程中運行,Dispatcher.Run()使當前線程進入消息循環,而設置線程的IsBackground為True是為了保證在程序退出時自動回收該線程,否則會出現進程駐留問題。