我在.NET Framework 4.5.1下运行WPF项目。有时,在背景线程块上运行的方法
lock (some_lock_up_the_callstack)
...
var rsc = App.Current.Resources["some_key"] as System.Windows.Media.Imaging.BitmapImage
同时,主线程在尝试访问数据框时也在some_lock_up_the_callstack
上等待。
带有键some_key
的请求资源实际上位于合并的字典中。
我似乎无法通过一个小的测试项目来重现此问题,而上面的MSDN文章似乎不能涵盖任何线程安全点。我尝试锁定主线程,并在锁定资源时尝试访问资源以查看,如果资源[]登录器是否锁定了主线程,但事实并非如此。至少我无法复制它。
任何帮助都非常感谢!
查看Resouscectionary
的源代码看来,由于CanBeAccessedAcrossThreads
是我的情况的CC_3,因此资源锁定的登录器SyncRoot
在CanBeAccessedAcrossThreads == true
中意味着它实际上锁定SystemResources.ThemeDictionaryLock
。因此,当WPF发动机在做某事时,可能会锁定造成僵局。