WPF的线程模型

来源:互联网 发布:算法证明 n2 o n3 编辑:程序博客网 时间:2024/05/17 09:41
 

                WPF的线程模型
           周银辉 

谈到多线程,很多人对其可能都不太有好感,觉得麻烦与易出错。所以我们不排除有这样的情况:假设我对“多线程”、“异步”这些字眼潜意识地有些反感,所以在编码过程中能不用就不用,觉得延迟几百毫秒还是可以忍受的,如果系统中这种“可以忍受”的地方很多,最后我们会发现系统的性能变得一团糟,界面总是在“卡”(阻塞)。这里我们讨论一下WPF的多线程模型,以便利用它使我们的UI线程得到解脱。

1,UI线程

传说WPF应用程序都至少有两个线程,一个用于UI绘制,其隐藏于后台,另一个用于管理UI,包括用响应用户输入执行后台代码等。MSDN上对这两个线程是这样描述的:“Typically, WPF applications start with two threads: one for handling rendering and another for managing the UI. The rendering thread effectively runs hidden in the background while the UI thread receives input, handles events, paints the screen, and runs application code. Most applications use a single UI thread, although in some situations it is best to use several.”后者便是所谓的UI线程,是我们需要经常面对的。

 

2,Dispatcher

WPF规定了(事实上在.net2.0中便已规定了)UI元素只能由创建该元素的线程来访问。比如我们从新开的一个线程中访问主界面中的元素会出现运行时的异常。Dispatcher来维持着这一规定,并组织着消息循环。Dispatcher负责检测访问对象的线程与对象创建线程是否一致,不一致则抛出异常。值得一提的是,Dispatcher的消息循环中的Work Item是有优先级的,这可以让高优先级的项能有更多的工作时间。比如界面绘制比处理用户输入的优先级要高,这使得界面动画更加流畅。这也就是为什么,我们在调用Dispatcher.Invoke ( DispatcherPriority,…) Dispatcher. BeginInvoke (DispatcherPriority,…)要传入一个优先级参数的原因。下面是对各个优先级的说明:

优先级

说明

Inactive

工作项目已排队但未处理。

SystemIdle

仅当系统空闲时才将工作项目调度到 UI 线程。这是实际得到处理的项目的最低优先级。

ApplicationIdle

仅当应用程序本身空闲时才将工作项目调度到 UI 线程。

ContextIdle

仅在优先级更高的工作项目得到处理后才将工作项目调度到 UI 线程。

Background

在所有布局、呈现和输入项目都得到处理后才将工作项目调度到 UI 线程。

Input

以与用户输入相同的优先级将工作项目调度到 UI 线程。

Loaded

在所有布局和呈现都完成后才将工作项目调度到 UI 线程。

Render

以与呈现引擎相同的优先级将工作项目调度到 UI 线程。

DataBind

以与数据绑定相同的优先级将工作项目调度到 UI 线程。

Normal

以正常优先级将工作项目调度到 UI 线程。这是调度大多数应用程序工作项目时的优先级。

Send

以最高优先级将工作项目调度到 UI 线程。

上面提到了Dispatcher维持着一个规矩“只有创建该对象的线程可以访问该对象”。这里的对象不仅仅是指一些UI控件(比如Button),而是所以的派生于DispatcherObject类的对象。我们做一个小小的试验,假设有如下这样一个类:

    public class Data
    
{
        
private object theData = null;

        
public object TheData
        
{
            
get
            
{
                
return theData;
            }

            
set
            
{
                theData 
= value;
            }

        }

}


文章来源于 http://www.cnblogs.com/zhouyinhui 版权归原作者所有
原创粉丝点击