在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中是必需的

在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线程的实例不会导致错误或问题(性能成本非常小,所以不要到处添加不必要的代码)。

相关文章:
  • 没有找到相关文章