调度程序未正确触发:Application.Current.Dispatcher.Invoke

时间:2016-04-11 20:23:44

标签: c# multithreading dispatcher

这个可能有点难以解释,但我会尽我所能。

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);
...
提前谢谢。

1 个答案:

答案 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线程