J'ai utilisé cette fonction dans une application 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();
}
Mais dans WPF
cela ne fonctionne pas. Pourquoi?
Dans WPF, la méthode Invoke
est affichée sur le répartiteur. Vous devez donc appeler Dispatcher.Invoke
au lieu de Invoke
. De plus, il n'y a pas de propriété InvokeRequired
, mais le répartiteur a une méthode CheckAccess
(pour une raison quelconque, elle est cachée dans intellisense). Donc, votre code devrait être:
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();
}
Dans WPF, utilisez la méthode CheckAccess
au lieu de InvokeRequired
if (!CheckAccess()) {
// On a different thread
Dispatcher.Invoke(() => log_left_accs(arg));
return;
}