Silverlight 线程处理概念和调度程序
Silverlight 支持线程处理的几个不同概念。覆盖 Silverlight 中的所有线程处理讨论的注意事项是:大多数情况下,Silverlight 在单个主 UI 线程上运行。您可能在 Silverlight 编程中执行的一个错误操作是引入阻止此主 UI 线程的内容。许多 Silverlight API,特别是那些有重新进入可能的 API,包含使 UI 线程难以被阻挡或不可能被阻挡的实现详细信息。但仍有这样的方案,在这种方案中,有可能阻挡 UI 线程并使应用程序无响应。
缓解 UI 线程阻塞状态的一种方法是:创建一个单独的线程并在其上执行工作。但是,结果是在 Silverlight 线程模型下,单独的辅助线程不能直接访问 UI 线程上的对象。在 Silverlight 中,后台线程可能会以异步方式影响 UI。例如,您可以使用后台辅助线程来更新对象数据源,并且该数据源传播会在 Silverlight 数据绑定中考虑到的更改。
从 UI 线程创建单独的线程的一种方法是使用 BackgroundWorker 类。但是,此技术与 Dispatcher 完全无关。它是通常能够用于任何 CLR 级别代码的线程比喻,而不仅是 Silverlight 的 UI 基类。通过 BackgroundWorker,您可以在线程完成后使用回调返回到 UI 对象或任何其他侦听器对象。有关更多信息,请参见BackgroundWorker。
Dispatcher 支持一种与 BackgroundWorker 技术并行的技术。Dispatcher 的模型是:您可以将工作项委托通过一个队列比喻添加到一个调度程序,并且根据系统已确定的优先级来处理工作项。Dispatcher 线程模型以基础体系结构中的 DependencyObject 位置为基础;您只能在 DependencyObject 上使用 Dispatcher 技术。许多 Silverlight 类型(尤其是来自 System.Windows 程序集的那些)都是从 DependencyObject 派生的,这通常意味着相关类型以某种方式与 UI 表示有关联,且不是常规编程逻辑和流的类型、原始数据、CLR 语言概念等。
在对 Dispatcher 线程技术进行任何操作前,都应调用 Dispatcher.CheckAccess(或者也可以在获取 Dispatcher 前调用 DependencyObject.CheckAccess)。如果任一 CheckAccess 返回 false,那么这意味着在您现在所处的状态中,尝试一项在 UI 线程中合法的操作将为非法。因此,您应改用 Dispatcher 并在队列中放入 BeginInvoke。
如果 CheckAccess 改为返回 true,那么没有必要使用 Dispatcher 调用该操作。应改为直接针对相关的 DependencyObject 执行操作。
【来源】http://msdn.microsoft.com/zh-cn/library/system.windows.dependencyobject.dispatcher(VS.95).aspx