Silverlight中的多个异步UI更新
如何从Silverlight回调中执行多个UI更新?
例如,我希望用户单击一个按钮,让UI进行更改,做一些工作,然后进行另一次更改……相反,用户单击按钮,回调似乎在后台执行,然后全部用户界面的变化在我眼前浮现。
MainPage.xaml中:
MainPage.xaml.cs中:
private void button1_Click(object sender, RoutedEventArgs e) { textBlock1.Text = "1"; // also tried Thread.Sleep(5000); Dispatcher.BeginInvoke(() => Thread.Sleep(5000)); textBlock1.Text = "2"; }
Silverlight使用工作项队列来处理UI线程上的呈现和逻辑。 由于您的逻辑也在UI线程上运行(在您的button_Click
处理程序中),渲染器没有机会绘制屏幕,直到您的方法执行button_Click
并且内部消息循环绕过绘制屏幕。
您的BeginInvoke
立即将您的函数放在Silverlight工作队列上以在UI线程上执行(并立即返回)。 Silverlight处理这个命令可能是这样的:
- 用户单击该按钮,在工作队列上放置一个单击事件
- Silverlight看到click事件并调用
button_Click
(它在工作队列上放置一个新动作) - 处理下一个可能是
Thread.Sleep
操作的工作队列项,暂停UI线程5秒钟 - 最后,Silverlight开始绘制屏幕
你想要做的是启动一个新的线程来完成你的工作,然后BeginInvoke
回到 UI线程:
var thread = new Thread(() => { Thread.Sleep(5000); Dispatcher.BeginInvoke(() => { // update UI textBox.Text = "2"; }); }); textBox.Text = "1"; thread.Start();
我应该补充一点,Silverlight 5添加了一个组合线程,可以执行某些操作来更新UI,而不会阻止UI线程,如播放动画和尽可能进行GPU加速渲染。
BeginInvoke异步运行,因此将返回并更改文本。
直接来自MSDN文档:“BeginInvoke是异步的;因此,控件在调用后立即返回调用对象。”
而是在BeginInvoke中添加您要执行的处理。 所以你做Thread.Sleep然后添加更改文本框。
BackgroundWorker也可以绑定事件。 因此,当UI更新又名BackGroundWorker完成事件时,您可以踢下一个项目。 这就是你应该使用BgroundWorker的原因
即
BackgroundWorker w = new BackgroundWorker(); w.DoWork += (sender, args) => { Thread.Sleep(5000); Dispatcher.BeginInvoke(() => { //your code here }); }; w.RunWorkerAsync();
- OLE DB与OPEN XML SDK vs Excel.interop
- 在entity framework4.1(CodeFirst)中更新对子对象的引用
- 使用C#访问Windows计划任务
- 无法从已加载的输入文档中删除空白区域。 将输入文档提供为XmlReader
- AjaxControlToolkit NoBotState始终是InvalidBadResponse
- MsChart选择一部分数据并更新图表
- .NET SMTP客户端 – 客户端无权作为此发件人发送
- 帮助理解Enumerable.Join方法
- 使用Windows Azure DiagnosticsMonitor时,log4net traceappender仅记录级别为“详细”的消息