2014-12-13 9 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

Вы не многопоточность здесь. Обе функции выполняются в потоке диспетчера.

Что вы имеете многопоточность - это вызов диспетчера для обработки этих функций, что не полезно, поскольку вызов BeginInvoke является асинхронным.

Что вы должны сделать, это сделать всю работу (функцию Clone) в потоке, а затем обновить UI в соответствии с ней. Диспетчерская нить не должна делать тяжелые работы, как то, что вы делаете.

+0

Я думал, что когда я использую диспетчер iam, просто позволяя другому потоку получить доступ к пользовательскому интерфейсу, теперь я его получу, я отредактирую код, соответственно, спасибо –

+0

@AmgadSerry. Вы можете получить дополнительную информацию о том, как работает Диспетчер: http: // tech.pro/tutorial/800/working-with-the-wpf-dispatcher – nkoniishvt

+0

спасибо @nkoniishvt –

Смежные вопросы