При использовании dispatcher.BeginInvoke, когда / почему мне нужно вызывать Dispatcher.Run? - PullRequest
0 голосов
/ 22 июня 2011

Кроме того, если я повторно использую this.dispatcher с другим BeginInvoke, нужно ли мне снова запускать Dispatcher.Run?

 var thread = new Thread(() =>
            {
                this.dispatcher = Dispatcher.CurrentDispatcher;
                this.dispatcher .BeginInvoke(new Action(() =>
                {
                    try
                    {
                       do something
                    }
                    catch (Exception ex)
                    {
                        onNotify(ex);
                    }
                }));
                Dispatcher.Run();
            });
            thread.Name = string.Format("{0} Hook Thread", this.GetType().Name);
            thread.IsBackground = true;
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();

1 Ответ

3 голосов
/ 22 июня 2011

Dispatcher.BeginInvoke добавляет делегата в очередь событий диспетчера.

Очередь обрабатывается только внутри Run().

Run() является блокировкойвызов, который будет выполняться вечно (или до тех пор, пока вы не вызовете InvokeShutdown()).

Если вы снова вызовете BeginInvoke(), Run() сразу увидит нового делегата и выполнит его немедленно.(Или как только это бесплатно)

...