2016-04-11 54 views
0

這個可能有點難以解釋,但我會盡我所能。調度程序沒有正確觸發:Application.Current.Dispatcher.Invoke

環境是一個WPF MVVM應用程序。

一類包括: ...

public ObservableCollection<Rat> Rats { get; set; } 

...

public void UpdateRats(int nbRats) 
     { 
      try 
      { 
       if (nbRats > 0) 
       { 
        for (int i = 0; i < nbRats; i++) 
        { 
         Application.Current.Dispatcher.Invoke(() => Rats.Add(new Rat())); 
         // Application.Current.Dispatcher.BeginInvoke( new Action(() => Rats.Add(new Rat() ))); 
         // Rats.Add(new Rat()); 
        } 
       } 
       if (threadSimul != null && !threadSimul.IsAlive) 
       { 
        threadSimul = new Thread(new ThreadStart(simul)); 
        threadSimul.Start(); 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

當UpdateRats由創建該對象的線程中調用,一切工作正常。 當從不同的線程調用它時,執行似乎停止在調度程序調用處: Application.Current.Dispatcher.Invoke(()=> Rats.Add(new Rat()));

調試器停止顯示此線程中的任何活動,儘管逐步調試不顯示證據表明它已退出線程。 線程仍然存在,但我沒有看到任何事情發生。

我可以不正確地調用調度程序嗎?

有什麼理由?

如果相關,第二個線程創建這樣:

threadSimul = new Thread(() => simul()); 
      threadSimul.SetApartmentState(ApartmentState.STA); 
      threadSimul.Start(); 

和模擬料包括:提前

... 
    UpdateRats(n); 
... 

THX。

回答

0

我以前遇到過這類問題。通常通過在方法之外創建調度器,它可以工作。嘗試在你的構造函數中創建它。例如:

private Dispatcher _dispatcher; 

public class RatManager() 
{ 
    _dispatcher = Dispatcher.CurrentDispatcher; 
} 

順便說一句,我不會調用Dispatcher.Invoke方法每次你做循環。這看起來會更好(至少對我來說)

// Assuming you already created a Dispatcher variable 
_dispatcher.BeginInvoke(() => 
{ 
    // Loop here 
} 

請注意,我在這裏使用BeginInvoke。除非您特別需要執行操作才能同步執行,否則BeginInvoke總是更好,因爲它不會阻止UI線程

+0

與您的提議相同。無論如何。 –