public abstract class DispatcherObject
{protected DispatcherObject();public Dispatcher Dispatcher { get; }public bool CheckAccess();public void VerifyAccess();
}
WPF中使用Dispatcher更新界面
xaml<Grid><TextBlock x:Name="tbkShow" HorizontalAlignment="Center" Margin="0,120,0,0" VerticalAlignment="Top"/><Button x:Name="btnLogin" Click="btnLogin_Click" Content="登录" Margin="0,88,0,0" VerticalAlignment="Top" Width="75" Height="23"/></Grid>
C#
形式一 (Thread )private void btnLogin_Click(object sender, RoutedEventArgs e){Thread thread = new Thread(Login);thread.Start();}private void Login() {for (int i = 0; i < 30; i++){Thread.Sleep(100);this.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate {btnLogin.Content = i + "s";if (i == 29)btnLogin.IsEnabled = true;});}}
形式二 (Task.Run) private void btnLogin_Click(object sender, RoutedEventArgs e){Task.Run(() =>{Dispatcher.Invoke(() =>{btnLogin.Content = "点击登录后";});});}
形式三 (Task.Factory) private void btnLogin_Click(object sender, RoutedEventArgs e){Task.Factory.StartNew(() =>{Task.Delay(100).Wait();Dispatcher.Invoke(() =>{btnLogin.Content = "登录成功";});});}
形式四 (参数行为new Action()) private void btnLogin_Click(object sender, RoutedEventArgs e){Thread thread = new Thread(Login);thread.Start();}private void Login() {Dispatcher.BeginInvoke(DispatcherPriority.Normal,new Action(() =>{Thread.Sleep(100);this.btnLogin.Content = DateTime.Now.ToString();}));}
形式五 (BeginInvoke 返回DispatcherOperation执行Completed) private void btnLogin_Click(object sender, RoutedEventArgs e){Thread thread = new Thread(Login);thread.Start();}private void Login() {var task= Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,new Action(() =>{Thread.Sleep(100);this.btnLogin.Content = DateTime.Now.ToString();}));task.Completed += new EventHandler(task_Completed);}private void task_Completed(object sender, EventArgs e){MessageBox.Show("任务已经完成");}private void Login() {double i = 0d;for (i = 0d; i < 800d; i++){Task.Delay(5).Wait();Action act = () => rect.Width++;Dispatcher.BeginInvoke(act, DispatcherPriority.Background);}}
}
DispatcherPriority枚举值
Invalid = -1,
Inactive = 0,
SystemIdle = 1,
ApplicationIdle = 2,
ContextIdle = 3,
Background = 4,
Input = 5,
Loaded = 6,
Render = 7,
DataBind = 8,
Normal = 9, 以正常优先级将工作项目调度到 UI 线程。这是调度大多数应用程序工作项目时的优先级
Send = 10 以最高优先级将工作项目调度到 UI 线程
public sealed class Dispatcher
{
public void Invoke(Action callback);
public void Invoke(Action callback, DispatcherPriority priority);
public void Invoke(Action callback, DispatcherPriority priority, CancellationToken cancellationToken);
public void Invoke(Action callback, DispatcherPriority priority, CancellationToken cancellationToken, TimeSpan timeout);
public object Invoke(Delegate method, params object[] args);
public DispatcherOperation BeginInvoke(Delegate method, params object[] args);
public DispatcherOperation BeginInvoke(Delegate method, DispatcherPriority priority, params object[] args);
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method);
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method, object arg);
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method, object arg, params object[] args);
}