2017-02-23 112 views
-1

Я запускаю проект WPF в .NET Framework 4.5.1. Иногда метод выполняется на фоне потока блоковWPF Resource [this object key] вызывает тупик

lock (some_lock_up_the_callstack) 
... 
var rsc = App.Current.Resources["some_key"] as System.Windows.Media.Imaging.BitmapImage 

В то же время главный поток также ждет на some_lock_up_the_callstack при попытке получить доступ к DataBinding.

Запрошенный ресурс клавишей some_key на самом деле находится в объединенном словаре.

Возможно, я не могу воспроизвести эту проблему с небольшим тестовым проектом, и the msdn article на нем, похоже, не покрывает точки безопасности нитей. Я попытался заблокировать основной поток и попытался получить доступ к ресурсам, пока он был заблокирован, чтобы увидеть, если Accessor блокирует основной поток, но это, похоже, не так. По крайней мере, я не могу воспроизвести его.

Любая помощь очень ценится!

+0

Вы ожидаете своей фоновой задачи в любом месте контекста пользовательского интерфейса? – grek40

+0

Да, основной поток ждет блокировки, удерживаемой фоновым потоком. – Tom

+0

Не то, что я имел в виду, но это не имеет значения (просто что-то проверили). Во всяком случае, блокировка вашего потока пользовательского интерфейса звучит как плохой подход ... как насчет запуска другой задачи для вашего действия блокировки или без блокировки чтения на вашем ресурсном доступе? – grek40

ответ

0

Глядя в source code для ResourceDictionary

кажется, что из-за CanBeAccessedAcrossThreads это true для моего случая, аксессор для блокировки ресурсов SyncRoot, которые в случае CanBeAccessedAcrossThreads == true означает, что он на самом деле блокирует SystemResources.ThemeDictionaryLock. Поэтому, когда движок wpf делает что-то, он может блокировать это, а также вызывать тупик.