Dans une méthode C# static
, je fais var brush = new LinearGradientBrush(_snazzyGradient);
et cette ligne génère une exception. _snazzyGradient
est défini comme suit:InvalidOperationException lors de la création de LinearGradientBrush dans l'application WPF multithread
private static readonly GradientStopCollection _snazzyGradient =
new GradientStopCollection
{
new GradientStop((Color)ColorConverter.ConvertFromString("#DBF3FF"), 0.0),
new GradientStop((Color)ColorConverter.ConvertFromString("#A3CCE0"), 1.0)
};
La classe qui contient à la fois la méthode et _snazzyGradient
met en œuvre INotifyPropertyChanged
, si elle importe, et est utilisé comme un modèle de vue. La méthode statique qui utilise _snazzyGradient
est appelée dans un constructeur pour la classe. Dans une classe UserControl
, j'ai défini la valeur d'une propriété de dépendance comme une nouvelle instance de cette classe de modèle de vue, en utilisant le constructeur qui référence _snazzyGradient
.
Quand je débogage mon application, à la ligne var brush = new LinearGradientBrush(_snazzyGradient);
, je reçois l'exception suivante:
System.InvalidOperationException a été capturé message = Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread est propriétaire . Source = WindowsBase StackTrace: à System.Windows.Threading.Dispatcher.VerifyAccess() à System.Windows.Threading.DispatcherObject.VerifyAccess() à System.Windows.Freezable.ReadPreamble() à System.Windows. Media.GradientStopCollection.OnInheritanceContextChangedCore (EventArgs args) à System.Windows.DependencyObject.OnInheritanceContextChanged (EventArgs args) à System.Windows.Freezable.AddInheritanceContext (contexte DependencyObject, propriété DependencyProperty) à System.Windows.DependencyObject.ProvideSelfAsInheritanceContext (DependencyObject doValue , DependencyProperty dp) à System.Windows.DependencyObject.ProvideSelfAsInheritanceContext (Valeur d'objet , DependencyProperty dp) à System.Windows.DependencyObject.UpdateEffectiveValue (ENTRYINDEX ENTRYINDEX, DependencyProperty dp, les métadonnées PropertyMetadata, EffectiveValueEntry oldEntry, EffectiveValueEntry & newEntry, Boolean coerceWithDeferredReference, OperationType OperationType) à System.Windows.DependencyObject.SetValueCommon (DependencyProperty dp, Objet valeur, les métadonnées PropertyMetadata, Boolean coerceWithDeferredReference, OperationType OperationType, Boolean isInternal) à System.Windows.DependencyObject.SetValueInternal (DependencyProperty dp, la valeur de l'objet) à System.Windows.Media.LinearGradientBrush..ctor (gradientStopCollection gradientStopCollection) à LoadedTemplate. getBackgroundForTemplateValue (String fieldName) at LoadedTemplate..ctor (ParentV iewModel viewmodel, modèle de modèle) à Form.LoadTemplate (modèle de modèle) InnerException:
Je l'ai déjà changé la propriété de dépendance dans mon UserControl
à ce qui suit:
public ParentViewModel Data
{
get
{
return (ParentViewModel)Dispatcher.Invoke(
DispatcherPriority.Background,
(DispatcherOperationCallback)delegate
{
return GetValue(DataProperty);
},
DataProperty
);
}
set
{
Dispatcher.BeginInvoke(
DispatcherPriority.Background,
(SendOrPostCallback)delegate
{
SetValue(DataProperty, value);
},
value
);
}
}
Ma question est, comment puis-je me débarrasser de ce InvalidOperationException
? Il ne semble pas correct d'avoir à mettre un tas d'appels liés au thread Dispatcher
dans mon modèle de vue. Ne devrais-je pas définir _snazzyGradient
comme un champ statique mais peut-être l'ai-je renvoyé d'une méthode statique? Je ne sais pas si cela aiderait. Je veux définitivement du multithread, car je ne veux pas que l'interface graphique s'enlise lorsque les fichiers nécessaires sont lus/écrits, ce genre de choses. Peut-être que mon problème provient de l'utilisation GradientStop
(hérite de DependencyObject
), etc. dans un modèle de vue; peut-être ceux-ci devraient être donnés au constructeur du modèle de vue de mon UserControl
?
Vous ne savez pas si cela s'applique ici, mais vous devriez toujours geler vos pinceaux en les utilisant dans différents threads. Vous n'aurez jamais à vous soucier des problèmes de threading lorsque vous le faites. – mdm20