Jestem bardzo zdezorientowany tym i zaczyna mnie kwestionować całe moje rozumienie systemu zasobów WPFDlaczego pakiety Freezables są już zamrożone i mają pustego Dispatchera (to samo ze stylami), gdy są przechowywane w Application.Resources?
Mam aplikację z wieloma oknami, gdzie każdy obiekt pochodzący z okna działa w oddzielnym wątku z oddzielnym modułem dyspozytorskim.
Thread t = new Thread(() => {
Window1 win = new Window1();
win.Show();
System.Windows.Threading.Dispatcher.Run();
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
Mam słownika zasobu Dictionary1.xaml o nazwie obiektu Style w środku (to po prostu ustawia właściwość tła na czerwono i jest kierowane na TextBox). W moim App.xaml odwołuję się do Dictionary1.xaml za pośrednictwem kolekcji ResourceDictionary.MergedDictionaries. W XAML innych moich okien mam StaticResource do klucza stylu w formancie textbox, który działa.
Jestem w stanie otworzyć wiele okien, ale czy nie powinienem otrzymywać błędów związanych z przecinaniem? W konstruktorze jednej z klas okiennych Zrobiłem to:
Style s = (Style)TryFindResource("TestKey");
Console.WriteLine(((Setter)s.Setters[0]).Property.Name); // no problem
s.Dispatcher == this.Dispatcher // false
ponieważ obiekt Style pochodzi od DispatcherObject, nie znaczy, że to jest dostępne tylko dla wątku, który jest jej właścicielem? A jeśli obiekt jest zdefiniowany w ResourceDictionary, nie oznacza to, że domyślnie jest to instancja statyczna? Jak to działa? Dlaczego nie otrzymuję błędu krzyżowego?
(I błędnie podano pytanie ja od usuniętego o przekroju błędu gwintowania, który został spowodowany przez coś innego)
Jestem bardzo zmieszany przez to - myślałem tylko mrożone freezable obiekty były współdzielone drugiej nici. Dlaczego mam dostęp do obiektu DispatcherObject w innych wątkach?
Tak, próbowałem CheckAccess i zwrócił true, podczas gdy VerifyAccess nie rzucił wyjątku . ReferenceEquals również zwraca wartość przewidywalną. Dzięki za przypomnienie mi, że DispatcherObject nie jest również obiektem magicznym, a powinowactwo wątku jest wymuszane przez ręczne wywoływanie do VerifyAccess() - świetny punkt/przypomnienie! Bardzo zdezorientowany – blue18hutthutt
Jako kolejny test, właśnie stworzyłem w słowniku zasobów. Powinno to stworzyć niezamrożoną nową SolidColorBrush, która z definicji NIE powinna być dostępna dla innego wątku, a jednak ... jest ORAZ do czasu, kiedy ją odzyskasz z innego okna - jest już zamrożona! Moje rozumienie, jak myślałem, że WPF pracował po prostu spadł ... –
blue18hutthutt
Oto kod metody Dispatcher.CheckAccess(): "return this.Thread == Thread.CurrentThread;" "this.Thread" jest naturalnie instancją wątku przechowywaną w obiekcie instanciation. Czy możesz potwierdzić, że ten test również zwraca się do Ciebie? –