Deployment.Current.Dispatcher.BeginInvoke(() => {...})的作用是什么?

19
我看到过一些代码中使用了 Deployment.Current.Dispatcher.BeginInvoke( ()=> {...} ) 的格式。它是用来在后台执行一些任务的吗?它通常的用途是什么?
3个回答

41

不,它不是在一个后台线程中执行工作,而是在UI线程上执行工作。因此,通常从后台线程调用它,以便操作UI,这只能在UI线程上完成。

lambda表达式的主体是您想要在UI线程中执行的代码。


1
Jon,你在SO上的帖子受欢迎程度非常高。我向你致敬 :) - Mick N
8
还值得一提的是,BeginInvoke 方法可以从 UI 线程本身调用,以便在现有的 UI 操作队列为空后,在 UI 线程上执行后续操作。这实际上是将工作推迟到 UI 线程不再执行任何操作。 - JustinAngel
@JonSkeet:我该如何在后台线程中执行代码,因为这段代码阻止了我的进度条在UI上显示? - RobertKing
@Rohaan:这取决于代码需要做什么。如果是构建UI,则不应该在后台线程中进行。如果它正在从其他地方获取数据(例如),那么在后台线程中执行是适当的。但这似乎与这个问题没有明显的关系... - Jon Skeet
@JonSkeet:感谢回复...http://stackoverflow.com/questions/24858710/how-to-perform-operation-on-a-background-thread 请查看我今天在上面链接发布的问题。 - RobertKing

6
当更新UI的代码从非UI线程执行时,会出现无效的跨线程访问异常。
调度程序允许您将一些代码从另一个线程传递到UI线程。
我在这篇文章中提供的项目演示了其中的概念以及其他内容。 WebClient、HttpWebRequest和Windows Phone 7上的UI线程

2

在SilverLight应用程序中,当您发现自己在非UI工作线程中执行任务(在不继承DependencyObject的上下文中)并且需要更新UI时,您需要使用Deployment.Current.Dispatcher


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接