Silverlight中 非UI线程更新UI 的几种方法:Delegate, AsyncOperation,BackgroundWorker
首先列一下基础代码:
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="Shareach.TestUI.UCThreadUpdate" d:DesignWidth="250" d:DesignHeight="120"> <StackPanel> <TextBlock x:Name="txtCalc" /> </StackPanel> </UserControl>
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Threading; namespace Shareach.TestUI { public partial class UCThreadUpdate: UserControl { public UCMsgSend() { InitializeComponent(); ThreadUpdate(); } void ThreadUpdate() { Thread thread = new Thread( new ThreadStart(DoWork)); thread.Start(); } void DoWork() { int i=0; while(i<100){ DoShow(i); } } } }
DoShow的三种写法
1. delegate
void DoShow(i){ this.Dispatcher.BeginInvoke( delegate { txtCalc.Text = string.format(“result “{0}”,i); }); }
2.AsyncOperation
void DoShow(i){ //这个可以写成成员变量,我这里只是为了好区分 System.ComponentModel.AsyncOperation asyncOper = System.ComponentModel.AsyncOperationManager.CreateOperation(null); asyncOper.Post(result => { txtCalc.Text = string.format(“result “{0}”,i); }, null); }
3.BackgroundWorker
参考 的
Winform 也一样,