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);
}