簡體   English   中英

調度程序無法正確觸發:Application.Current.Dispatcher.Invoke

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM