2016-12-08 1 views
0

해결 방법을 찾을 수 없다는 문제가 발생하여 BackgroundWorker를 올바르게 이해하지 못하고 있다고 생각하기 시작했습니다.BackgroundWorker를 사용하여 직렬화 메서드 호출

내 프로그램의 저장 /로드 기능을 처리하기 위해 BackgroundWorker를 사용하려고합니다. 즉, 작업자가 내가 만든 직렬화 메서드를 호출하도록하고 싶습니다.

직렬화 방법은 POCO를 사용하고 xml이 직렬화합니다. 이 POCO는 여러 속성을 포함하며 그 중 하나는 Brush 유형입니다.

public Brush ShapeColor{ get; set; } 

나는 색상을 직렬화하고 싶지만 나는 브러쉬를 직렬화 할 수 없기 때문에, 나는 지원 프로퍼티했습니다하십시오 BackgroundWorker를 사용하지 않고

public Color StoreColor 
{ 
    get 
    {   
     g = ((Color)ShapeColor.GetValue(SolidColorBrush.ColorProperty)).G; 
     r = ((Color)ShapeColor.GetValue(SolidColorBrush.ColorProperty)).R; 
     b = ((Color)ShapeColor.GetValue(SolidColorBrush.ColorProperty)).B;   
     return Color.FromRgb(r, g, b); 
    } 
    set {} 
} 

이 잘 작동합니다. 은 그러나 곧 나는 doWork 방법 직렬화 메소드의 메소드 호출을 만들려고 노력으로, 예외가 던져 : 다른 스레드가 그것을 소유하고 있기 때문에

호출 스레드가이 개체에 액세스 할 수 없습니다. 이들에

:

g = ((Color)ShapeColor.GetValue(SolidColorBrush.ColorProperty)).G; 
r = ((Color)ShapeColor.GetValue(SolidColorBrush.ColorProperty)).R; 
b = ((Color)ShapeColor.GetValue(SolidColorBrush.ColorProperty)).B; 

나의 이해는 UI 스레드가 아닌 다른 스레드에서 직렬화 메소드를 호출하는 BackgroundWorker를 사용하여, 나는 노동자가 UI 요소에 액세스 할 수 없다는 규칙을 위반하는 것입니다.

솔직히 말해서 내 질문을 공식화하는 방법에 대해 확신 할 수 없지만 작업자로부터 이러한 POCO를 직렬화 할 수는 없습니까? 브러시 인 ShapeColor과 관련이 있습니까?

미리 감사하고 내 나쁜 설명 :

편집 죄송합니다 다음 XML 직렬화 방법을 게시.

public static void convertToXML<T>(T objectToSave, string path) where T : new() 
    { 
     StreamWriter streamWriter = null; 
     try 
     {    
      XmlSerializer serializer = new XmlSerializer(typeof(T)); 
      streamWriter = new StreamWriter(path, false);    

      XmlWriterSettings settings = new XmlWriterSettings() 
      { 
       Indent = true, 
       OmitXmlDeclaration = true, 
      }; 
      serializer.Serialize(streamWriter, objectToSave); 

     } 
     finally 
     { 
      // Close writer 
      if (streamWriter != null) 
      { 
       streamWriter.Close(); 
      } 
     } 
    } 
+0

시도가'''Thread.CurrentThread.ManagedThreadId''' 당신이 만들 때를 확인하려면'''ShapeColor'''하고 여기에 접근. – tym32167

+1

브러시와 같은 GDI 개체는 데이터 구조 일뿐만 아니라 UI 스레드와 연결되어 있습니다. BGW를 사용할 필요가 없습니다. BGW는 더 이상 사용되지 않으며 비동기 저장에는 완전히 필요하지 않습니다. 예를 들어 FileStream과 같은 비동기 메서드를 사용하여 데이터를 비동기 적으로 저장할 수 있습니다. –

+0

* serialization * 코드를 게시하십시오.귀하가 게시 한 코드는 문제를 일으키지 않으며 수정하지 못합니다. –

답변

0

Freezable 개체가 실행되었습니다.

이러한 개체는 일반적으로 Unfrozen 상태 (해당 경우에는 Dispatcher 스레드)에서 처리 할 수 ​​있습니다. 그들을 처리 (그리고 그들을 조작) 다른 스레드에서, 당신이 중 하나를 Freeze()에 필요하고 다른 스레드에 넘겨 또는 Dispatcher.Invoke()를 사용하여 Dispatcher 스레드에서 호출을하기 위해

.

int r =0; 
int g =0; 
int b =0; 
//Marshalls back to UI thread 
Dispatcher.Invoke(()=>{ 
r = ((Color)ShapeColor.GetValue(SolidColorBrush.ColorProperty)).R; 
g = ((Color)ShapeColor.GetValue(SolidColorBrush.ColorProperty)).G; 
b = ((Color)ShapeColor.GetValue(SolidColorBrush.ColorProperty)).B; 
}); 
//Creates object on BGW thread and can be safely used for serialization 
return Color.FromRgb(r, g, b); 
+0

그래서 나는 당신의 솔루션을 시도했다 :)! 비록 'Application.Current.Dispatcher.Invoke ..'대신 사용해야합니다. 그래도 괜찮은지 모르겠습니까? – ElloU

+0

일반적으로 애플리케이션 당 하나의 Dispatcher 만 있으면됩니다. Dispatchers를 여러 명 사용할 수는 있지만 상당히 전문화되고 고급 방법입니다. 답으로 표시하는 것을 잊지 마십시오. :) – toadflakz

관련 문제