ImageSource/BitmapImage와 '다른 스레드가 이 개체를 소유하고 있어 호출 스레드가 해당 개체에 액세스할 수 없습니다.' 예외

Sentry.IO에서 출시 후 계속해서 “다른 스레드가 이 개체를 소유하고 있어 호출 스레드가 해당 개체에 액세스할 수 없습니다.” 라는 명확하지 않은 스택 트레이스와 함께 프로그램 종료 로그가 계속 수신되서 살펴보다가, 결국 원인을 찾았습니다.

ImageSource라는 타입을 비 UI 스레드에서 만드는 동작이 있었는데, ImageSource 역시 DispatchObject라는 WPF의 상위 개체 타입을 상속받기 때문에, 어느 스레드에서 만들었는가에 따라 문제가 되는 점이 있었습니다. 다행히, Freeze 메서드를 호출하여 ImageSource의 내용이 더는 변하지 않음을 선언할 수 있는 종류의 것 (각 사이트의 로고)이었고, 문제 재현 방법도 빠르게 찾을 수 있어서 내일 정도에 새 빌드를 출시하려 합니다.

WPF의 스택 추적이나 오류 정보가 불명확한 것이 여러모로 아쉬웠지만 그나마 Sentry 덕분에 문제 사실을 확인하고 해결 방안을 찾을 수 있었습니다.

7 Likes

이미 해결하셨다니 다행입니다.

                // https://stackoverflow.com/questions/45893536/updating-image-source-from-a-separate-thread-in-wpf
                bitmapImage.Freeze();

                _imageTable.Add(eachSiteId, bitmapImage);

저는 보통 프리즈 전에 가능여부를 따져보고 프리즈를 하는편입니다! 저도 호되게 이미지에 당한적이 있고 지금도 당하구 있네요…

                // https://stackoverflow.com/questions/45893536/updating-image-source-from-a-separate-thread-in-wpf
                if (bitmapImage.CanFreeze)
                      bitmapImage.Freeze();

                _imageTable.Add(eachSiteId, bitmapImage);
2 Likes