프로그래밍/WPF

[오류해결] Brush - DependencyObject와 같은 스레드에서 DependencySource를 만들어야 합니다.

흔한티벳여우 2022. 12. 21. 14:14
반응형

 WPF에서 Json으로 직렬화와 역직렬화하여 화면에 디스플레이 하다가 UI Thread에선 문제가 없었는데, Task를 태워서 비동기 처리를 하려다 보니 아래와 같은 오류가 발생되었다.

DependencyObject와 같은 스레드에서 DependencySource를 만들어야 합니다.

 처음엔 이게 뭐야??? 하면서 내가 사용한 객체들에 대해 뒤져보게 되었다.

일단 DependencyObject가 같은 Thread에서 나와야 한다는것이 일단 Dispatcher를 이용하면 될것이라는 것은 명확했다.

하지만 어느 부분에서?? 라는 것이 문제였다.

 워낙 많은 양의 데이터를 역직렬화하다보니 전체를 감싸기도 애매했다.

그래서 객체에 담긴 모든 데이터를 다 확인해보기 시작했다.

 뭐 결론은 Brush다.

https://learn.microsoft.com/ko-kr/dotnet/api/system.windows.media.brush?view=windowsdesktop-7.0 

 

Brush 클래스 (System.Windows.Media)

그래픽 개체를 그리는 데 사용할 개체를 정의합니다. Brush에서 파생된 클래스는 영역을 그리는 방법을 설명합니다.

learn.microsoft.com

msdn에 가보면 Brush 클래스는 상속레벨이 아래와 같다.

Object
DispatcherObject
DependencyObject
Freezable
Animatable
Brush

이놈이 UI Thread에서 만들어줘야 하는 녀석이였다.

private string _stoke;
public string Stroke
{
    get { return _stoke; }
    set 
    { 
        SetProperty(ref _stoke, value);
        Application.Current.Dispatcher.Invoke(() =>
        {
            BrushStroke = (Brush)new System.Windows.Media.BrushConverter().ConvertFromString(_stoke);
        });
    }
}
[JsonIgnore]
public Brush BrushStroke { get; set; }

보는것과 같이 Setter에 Dispatcher를 넣어서 UI Thread에 동기화 할수 있도록 처리하였다.

그러니 문제 없었다.

반응형