2014-09-16 4 views
1

서버에서받은 데이터를 역 직렬화하기 위해 DataContract을 사용하는이 Model 클래스를 사용하고 있습니다. 따라서이 두 필드는 DataDataColor이고 서버에서 Data을 보내고 어떤 로직을 사용하여 DataColor을 파생 시켰습니다.크로스 스레드 액세스가 잘못되었습니다.

ModelClass.cs

private double _data; 
    [DataMember(Name = "data")] 
    public double Data 
    { 
     get { return this._data; } 
     set 
     { 
      SetField(ref _data, value, "Data"); 
      this.DataColor = Util1.GetColorFromData(value); 
     } 
    } 

    private SolidColorBrush _dataColor; 
    public SolidColorBrush DataColor 
    { 
     get { return this._dataColor; } 
     set { SetField(ref _dataColor, value, "DataColor"); } 
    } 

내가 내 Util1 클래스 함수 중 하나를 호출하고 DataColor을 설정합니다.

Util1.cs 차례로 다른 클래스를 호출

public static SolidColorBrush GetColorFromData(double data) 
    { 
     // apply some logic to get hexColor from data 
     return Util2.GetSolidColorFromHex(string hexColor); 
    } 

'hexColor-SolidColorBrush

Util2.cs

GetSolidColorFromHex(string hexColor) 
    { 
     return new SolidColorBrush(
      Color.FromArgb(
       255, 
       Convert.ToByte(hexaColor.Substring(1, 2), 16), 
       Convert.ToByte(hexaColor.Substring(3, 2), 16), 
       Convert.ToByte(hexaColor.Substring(5, 2), 16) 
      )); 
    } 

을 변환하는 Util2 기능은 지금은 돈' 왜 내가 이걸 얻고 있는지 전혀 모른다. SolidColorBrush 개체를 만들려고 할 때 Util2.cs에서오류가 발생했습니다. 여기에 UI 개체를 변경하려고하지 않습니다.

여기서는 Deployment.Current.Dispatcher.BeginInvoke()을 사용하려고 생각했지만 여기서는 함수에서 값을 반환하기 때문에 Dispatcher를 사용할 수 없다고 생각합니다.

이 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

나는 이것에 많은 시간을 낭비했고 GetSolidColorFromHexUtil2에서 Util1으로 이동하려고 시도했습니다. 여전히 성공하지 못했습니다.

Invalid cross thread을 전달하는 일부 일반적인 방법이나 다른 상황을 전달하는 것은 아닙니다.

감사

답변

1

당신이 UI 속성을 변경하려고하지 않는 있지만이하는 SolidColorBrush에만 UI 스레드에서 인스턴스화 할 수 있습니다.

브러시의 개인 변수를 생성하기 위해 UI 스레드에서 생성을 수행 한 다음이를 반환 할 수 있습니다.

편집 : 확인하기 위해 PC에서하지 않고

, 나는 이런 식으로 뭔가가 작동합니다 생각 :

GetSolidColorFromHex(string hexColor) 
{ 
    SolidColorBrush brush; 
    Deployment.Current.Dispatcher.BeginInvoke(
     () => brush = new SolidColorBrush(
      Color.FromArgb(
       255, 
       Convert.ToByte(hexaColor.Substring(1, 2), 16), 
       Convert.ToByte(hexaColor.Substring(3, 2), 16), 
       Convert.ToByte(hexaColor.Substring(5, 2), 16) 
     ))); 

    return brush; 
} 
+0

오. 그러나 다른 대안은 없습니다. 당신이 얻은 대답은 Util1과 Util2의 로직을 MainPage.xaml.cs와 같은 UI 스레드로 이동시켜 ModelClass.cs에서 호출해야한다는 것입니다. 내가 틀렸다면 나를 바로 잡아주세요. – PratPor

+0

@PratPor 예제를 사용하여 답변을 업데이트했습니다. – Joeb454

+1

매우 놀랍습니다. Afaik 객체는 다른 스레드에서 인스턴스화되어 고정 된 다음 사용되는 스레드로 보내집니다 (고정 이미지의 경우 작동 함). 어쨌든 칫솔이 아닌 단순한 색상만으로 작업 할 수는 없습니까? 또는 다른 스레드에서 두 번째 디스패처를 만들 수 있습니까? 나는 이것이 효과가있을 것 같아요. –

관련 문제