在wpf中是必需的
本文关键字:wpf | 更新日期: 2023-09-27 18:04:47
我在一个Windows forms
应用程序中使用了这个函数:
delegate void ParametrizedMethodInvoker5(int arg);
private void log_left_accs(int arg)
{
if (InvokeRequired)
{
Invoke(new ParametrizedMethodInvoker5(log_left_accs), arg);
return;
}
label2.Text = arg.ToString();
}
但是在WPF
中它不起作用。为什么?
在WPF中,Invoke
方法在调度程序上,因此您需要调用Dispatcher.Invoke
而不是Invoke
。同样,没有InvokeRequired
属性,但是调度程序有一个CheckAccess
方法(由于某种原因,它隐藏在智能感知中)。所以你的代码应该是:
delegate void ParametrizedMethodInvoker5(int arg);
void log_left_accs(int arg)
{
if (!Dispatcher.CheckAccess()) // CheckAccess returns true if you're on the dispatcher thread
{
Dispatcher.Invoke(new ParametrizedMethodInvoker5(log_left_accs), arg);
return;
}
label2.Text= arg.ToString();
}
在WPF中使用CheckAccess
方法而不是InvokeRequired
if (!CheckAccess()) {
// On a different thread
Dispatcher.Invoke(() => log_left_accs(arg));
return;
}
check Dispatcher.CheckAccess()
WPF使用Dispatcher
来控制对消息泵的访问,而不是让每个控件负责访问UI线程。
你应该使用Dispatcher.Invoke
在WPF应用程序的UI线程中添加一个委托。
值得注意的是,InvokeRequired
在winform应用程序中并不是真正需要的,在WPF应用程序中也不应该检查它。当你调用Invoke
时,你应该知道你不在UI线程中。你不应该遇到这样的情况:一个给定的方法有时从UI线程调用,有时从后台线程调用。选择一个;要么总是强制调用者在调用给定方法之前调用UI线程(这样就不需要调用),要么假设调用者在调用方法时不在UI线程中。同样值得注意的是,当你已经在UI线程中时调用Invoke
是很好的。偶尔重新调用UI线程的实例不会导致错误或问题(性能成本非常小,所以不要到处添加不必要的代码)。