2014-12-13 43 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线程中执行。

你的多线程是调用Dispatcher来处理这些函数,这是没有用的,因为BeginInvoke调用是异步的。

你应该做的是做一个线程中的所有工作(克隆函数),然后根据它来更新UI。调度程序线程不应该像你正在做的那样做繁重的工作。

+0

我认为当我使用调度员IAM只是让另一个线程访问用户界面我现在得到它我将编辑我的代码相应谢谢 – 2014-12-13 18:10:57

+0

@AmgadSerry你可以得到更多关于Dispatcher如何在这里工作的信息:http:// tech.pro/tutorial/800/working-with-the-wpf-dispatcher – nkoniishvt 2014-12-13 18:13:39

+0

谢谢@nkoniishvt – 2014-12-13 18:29:26