[英]dispatcher does not trigger correctly: 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();
Simul包含:
...
UpdateRats(n);
...
提前謝謝。
我以前遇到過這樣的問題。 通常,通過在您的方法之外創建調度程序即可。 嘗試在構造函數中創建它。 就像是:
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線程
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.