c# - BeginInvoke 未在 WPF 应用程序的线程内触发

标签 c# .net wpf

我在 WPF 应用程序中有这个简单的代码:

ThreadStart start = delegate()
{
    Thread.Sleep(5000);
    Console.WriteLine("HEY!");

    Dispatcher.CurrentDispatcher.BeginInvoke(
        DispatcherPriority.Normal,
        new Action(
            delegate()
            {
                Console.WriteLine("Inside invoke?!");
            }
        )
    );
};

new Thread(start).Start();

嘿! 会在片刻后正常打印,并且应用程序不会像使用线程所期望的那样被阻塞,但是,为什么我从来没有看到内部调用?!?我还尝试了不同的优先级,例如 Send,我认为这是最高优先级。

我也试过在里面放断点,但它从未停在那里。

最佳答案

先了解一些基础知识 -

  • 每个线程都有自己的 Dispatcher 和 Dispatcher。CurrentDispatcher 将始终返回当前正在执行的线程的 Dispatcher。
  • BeginInvoke 根据 DispatcherPriority 指定的优先级异步执行您指定的委托(delegate)。

代码问题 - 您正在将委托(delegate)放置在您创建的辅助线程的 Dispatcher 队列中。但是在辅助线程有时间执行它之前,您的辅助线程退出了,因此它的调度程序也退出了。这就是委托(delegate)永远不会被执行的原因。

有两种方法可以实现这一点-

像这样在调度程序上同步地排队委托(delegate) -

Dispatcher.CurrentDispatcher.Invoke(
                    DispatcherPriority.Normal,
                    new Action(
                        delegate()
                        {
                            Console.WriteLine("Inside invoke?!");
                        }
                    )
                );

或者您可以像这样在主线程(通常称为 UI 线程)的调度程序上将其排队 -

Application.Current.Dispatcher.BeginInvoke(
                    DispatcherPriority.Normal,
                    new Action(
                        delegate()
                        {
                            Console.WriteLine("Inside invoke?!");
                        }
                    )
                );

关于c# - BeginInvoke 未在 WPF 应用程序的线程内触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11178334/

相关文章:

c# - 文本 block 和标签 wpf 上的文本选择

c# - 通过泛型类型参数访问属性

wpf - 有没有简单的方法在 WPF 中播放 rtp 视频/音频流?

c# - 如果用户 = SYSTEM,.NET 用户设置存储在哪里?

c# - 创建新的 .Net Core 控制台进程 : Exception when using environment variables with UseShellExecute=true

.net 数据集如何获取已删除的子行

WPF - 配置自定义事件以触发用户控件上的开始 Storyboard

c# - C# selenium 中的用户代码未处理 OpenQA.Selenium.NoSuchElementException

c# - 我可以利用 ViewState 来消除传递查询字符串的需要吗?

C# 枚举反向索引