这个可能有点难以解释,但我会尽我所能。
Environment是一个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(()=&gt; Rats.Add(new Rat()));
调试器停止显示此线程中的任何活动,尽管逐步调试没有显示它退出线程的证据。 线程还活着,但我看不到发生任何事情。
我可以错误地调用调度员吗?
有什么理由吗?
如果相关,则以这种方式创建第二个线程:
threadSimul = new Thread(() => simul());
threadSimul.SetApartmentState(ApartmentState.STA);
threadSimul.Start();
和Simul包含:
...
UpdateRats(n);
...
提前谢谢。
答案 0 :(得分: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线程