2014-12-13 4 views
0

여기 캔버스 배경과 요소를 업데이트하는 클래스가 있습니다. 요소 업데이트가 꽤 많이 걸리므로 배경 업데이트를 요소와 별도로 만들고 싶습니다. 그러나 스레딩을 사용할 때 알지 못했습니다. 어떤 차이 때 내가 그들 모두 내가 모두 동일한 스레드에서 추측 그래서 일시 정지있어 여기에 현재 멀티 스레딩되지 않은 코드스레드가 동시에 시작되지 않습니다.

namespace 
{ 
    class CanvasHandler 
    { 
     private Canvas _canvas; 
     private Grid gird; 
     private Brush _image; 
     private UiHandler uiHandler; 
     private Thread thread,thread1; 
     public CanvasHandler(Canvas canvas, UiHandler uiHandler) 
     { 
      this._canvas = canvas; 
      this.uiHandler = uiHandler; 
      this.gird = this._canvas.Parent as Grid; 
     } 

     public void Update() 
     { 

      thread = new Thread(UpdateImage); 
      thread.Start(); 
      thread1 = new Thread(UpdateCanvas); 
      thread1.Start(); 



     } 

     public void UpdateImage() 
     { 
      this._canvas.Dispatcher.BeginInvoke((Action)(() => this._canvas.Background = uiHandler.SourceCanvas.Background)); 

     } 

     public void UpdateCanvas() 
     { 
      this._canvas.Dispatcher.BeginInvoke((Action)(UpdateCanvas_)); 


     } 

     private void UpdateCanvas_() 
     { 
      Thread.Sleep(500); 
      this._canvas.Children.Clear(); 
      foreach (UIElement child in uiHandler.SourceCanvas.Children) 
      { 
       var clone = Clone(child); 
       this._canvas.Children.Add(clone); 


      } 
     } 

     public T Clone<T>(T source) 
     { 
      string objXaml = XamlWriter.Save(source); 
      var stringReader = new StringReader(objXaml); 
      XmlReader xmlReader = XmlReader.Create(stringReader); 
      var t = (T)XamlReader.Load(xmlReader); 
      return t; 
     } 

    } 
} 

답변

3

이 중 하나를 일시 중지되었습니다. 두 기능 모두 Dispatcher 스레드에서 실행됩니다.

멀티 스레드 된 것은 BeginInvoke 호출이 비동기 적이므로 유용하지 않은 해당 기능을 처리하기위한 Dispatcher 호출입니다.

스레드에서 모든 작업 (복제 기능)을 수행 한 다음 UI를 업데이트해야합니다. 운영자 스레드는 사용자가하는 일과 같이 무거운 작업을해서는 안됩니다.

+0

나는 dispatcher iam을 사용하여 다른 스레드가 UI에 액세스하도록 허용 할 때 그에 맞게 코드를 편집 할 것이라고 생각했습니다. –

+0

@AmgadSerry 여기에서 Dispatcher의 작동 방식에 대한 자세한 정보를 얻을 수 있습니다. http : // tech.pro/tutorial/800/working-with-the-wpf-dispatcher – nkoniishvt

+0

감사합니다. @nkoniishvt –

관련 문제