了解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是为了保证在程序退
出时自动回收该线程,否则会出现进程驻留问题。
谨以此记录成长的脚步,同时和大家一起分享快乐。