Je suis assez nouveau pour travailler avec des threads. Je tentais de définir une valeur de DependencyProperty
:différence entre SendOrPostCallback et Action dans un environnement multithread?
public States State
{
get { return (States)GetValue(StateProperty); }
set
{
Dispatcher.BeginInvoke(DispatcherPriority.Background,
//(SendOrPostCallback)delegate { SetValue(StateProperty, value); }, //works
(Action)(()=> SetValue(StateProperty, value)), //doesnt
value);
}
}
public static readonly DependencyProperty StateProperty =
DependencyProperty.Register("State", typeof(States), typeof(FTPDownload), new UIPropertyMetadata(States.Idle));
Je pris conscience de la dure que le poseur vous devez utiliser SendOrPostCallback (car il fournit un argument lors de l'appel de la méthode). il ne fonctionne PAS avec Action (à cause de l'argument manquant), et wpf est vraiment une bête à ce sujet, le débogage et la recherche de la cause de la TargetParameterCountException avec "aucune source disponible" et aucun indice du tout
Pourquoi je doivent utiliser SendOrPostCallback là et comment dois-je sais que dans ce cas, c'est la bonne raison d'appeler en fait le poseur fonctionne via:?
Dispatcher.BeginInvoke((Action)(()=>State=States.Updating), null);
et en utilisant le SendOrPostCallback au lieu des résultats de cours dans un TargetParameterCountException ..
Je me demandais si une chose apparemment inconsistante comme celle-là ne Nowledge? Se sentir un peu perdu ici, au moins depuis googling autour avec SendOrPostCallback, Action et BeginInvoke comme mots clés n'avaient pas de résultats significatifs.
Pour votre information, le poseur d'Etat est _pas called_ si la mise à jour se produit à la suite des données système de reliure. Il appellera SetValue directement. En tant que tel, cette approche de la synchronisation peut ne pas fonctionner comme prévu.La meilleure pratique générale consiste à s'assurer que toutes les mises à jour de DP se produisent sur le thread d'interface utilisateur, ce qui signifie isoler votre logique d'interface utilisateur (ViewModel) de tout travail multithread dans les données et la logique sous-jacentes (Model). –