为什么WPF的Dispatcher.Invoke在主线程上运行时不会导致死锁?

弗兰克·亚当斯

考虑以下代码:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            //System.Threading.Thread.CurrentThread = button.Dispatcher.Thread
            button.Dispatcher.Invoke(() => button.Content = "1234");
        }
    }

当然button_Click是在主线程上运行的。

我的理解是,这button.Dispatcher.Thread是主线程,并且Invoke()仅当未阻塞线程时才会进行处理。但是,在这种情况下主线程是否不会被阻塞?即主线程正在等待Dispatcher.Invoke()调用完成,并且Dispatcher.Invoke()正在等待主线程释放。因此,我预计这里会出现僵局,但不会陷入僵局。

为什么?

PS:我知道在这种情况下我不需要Dispatcher.Invoke,我可以button.Content = "1234"直接致电我试图理解为什么在这种情况下不会发生死锁。

随身软件

我相信您的误解可能是基于以下思考过程:

“好吧,Invoke会阻塞调用线程,直到操作完成为止。如果线程被阻塞,它将如何对该线程执行操作?”

如果我们在源代码内部查看,我们不仅会在同一线程上调用回调,而且还会在Invoke方法内部直接*调用该回调。主线程未被阻止。

如果查看调度程序的“参考源”页面,则可以if在该Invoke方法的实现中语句上方看到以下注释,并在其中调用回调:

// Fast-Path: if on the same thread, and invoking at Send priority,
// and the cancellation token is not already canceled, then just
// call the callback directly.
if(!cancellationToken.IsCancellationRequested && priority == DispatcherPriority.Send && CheckAccess())
{
    /* snipped */

    callback();

    /* snipped */
}

您正在调用Dispatcher.Invoke主线程,该方法通过立即调用来处理该问题。

*不是直接的,而是整个Invoke(Action)过程只是对上面代码所在的方法的调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么此异步/等待代码不会导致死锁?

来自分类Dev

当从普通线程(非 ui)调用在 ui 线程上运行时,主线程会做什么?

来自分类Dev

在运行时添加多个视图而不会给主线程带来太多负载的正确方法是什么

来自分类Dev

为什么在使用默认的prepare_arch_switch()时schedule()不会导致死锁

来自分类Dev

Erlang/Akka 等如何在后台发送消息?为什么不会导致死锁?

来自分类Java

为什么缺少的注释不会在运行时导致ClassNotFoundException?

来自分类Dev

为什么映像不会在主线程上加载?

来自分类Dev

为什么移动此行会导致死锁?

来自分类Dev

为什么pthread_cond_signal导致死锁

来自分类Dev

使用单线程执行器时,为什么“ header.get()+ footer.get()”会导致死锁?

来自分类Dev

WPF Resource[this object key] 导致死锁

来自分类Dev

为什么UIWebView的AVPlayerViewController不在主线程上运行?

来自分类Dev

为什么CompletableFuture的thenAccept()无法在主线程上运行

来自分类Dev

为什么我的NSOperationQueue在主线程上运行?

来自分类Dev

为什么我的代码在主线程上运行?

来自分类Java

为什么ForkJoinPool ::的invoke()阻塞主线程?

来自分类Dev

在Akka Dispatcher上启动时,为什么Futures中的Futures按顺序运行

来自分类Dev

为什么任务在主线程中运行?

来自分类Dev

在设备上运行时,为什么按钮透明?

来自分类Dev

为什么要在主线程上订阅?

来自分类Dev

为什么这种WPF TreeViewItem样式导致跨线程问题?

来自分类Java

为什么在静态初始化程序中使用lambda进行并行流会导致死锁?

来自分类Dev

为什么以不同顺序解锁两个锁定的银行帐户会导致死锁?

来自分类Dev

为什么在Golang中发送大于缓冲通道大小的值会导致死锁错误?

来自分类Dev

为什么在同一goroutine中使用未缓冲的通道会导致死锁?

来自分类Dev

Java:为什么当锁为null时这会导致死锁?

来自分类Dev

为什么在Windows Service中阻止异步会导致死锁?

来自分类Dev

为什么重新使用条件变量的互斥锁会导致死锁?

来自分类Dev

Dispatcher.Invoke更新WPF画布会导致性能问题

Related 相关文章

  1. 1

    为什么此异步/等待代码不会导致死锁?

  2. 2

    当从普通线程(非 ui)调用在 ui 线程上运行时,主线程会做什么?

  3. 3

    在运行时添加多个视图而不会给主线程带来太多负载的正确方法是什么

  4. 4

    为什么在使用默认的prepare_arch_switch()时schedule()不会导致死锁

  5. 5

    Erlang/Akka 等如何在后台发送消息?为什么不会导致死锁?

  6. 6

    为什么缺少的注释不会在运行时导致ClassNotFoundException?

  7. 7

    为什么映像不会在主线程上加载?

  8. 8

    为什么移动此行会导致死锁?

  9. 9

    为什么pthread_cond_signal导致死锁

  10. 10

    使用单线程执行器时,为什么“ header.get()+ footer.get()”会导致死锁?

  11. 11

    WPF Resource[this object key] 导致死锁

  12. 12

    为什么UIWebView的AVPlayerViewController不在主线程上运行?

  13. 13

    为什么CompletableFuture的thenAccept()无法在主线程上运行

  14. 14

    为什么我的NSOperationQueue在主线程上运行?

  15. 15

    为什么我的代码在主线程上运行?

  16. 16

    为什么ForkJoinPool ::的invoke()阻塞主线程?

  17. 17

    在Akka Dispatcher上启动时,为什么Futures中的Futures按顺序运行

  18. 18

    为什么任务在主线程中运行?

  19. 19

    在设备上运行时,为什么按钮透明?

  20. 20

    为什么要在主线程上订阅?

  21. 21

    为什么这种WPF TreeViewItem样式导致跨线程问题?

  22. 22

    为什么在静态初始化程序中使用lambda进行并行流会导致死锁?

  23. 23

    为什么以不同顺序解锁两个锁定的银行帐户会导致死锁?

  24. 24

    为什么在Golang中发送大于缓冲通道大小的值会导致死锁错误?

  25. 25

    为什么在同一goroutine中使用未缓冲的通道会导致死锁?

  26. 26

    Java:为什么当锁为null时这会导致死锁?

  27. 27

    为什么在Windows Service中阻止异步会导致死锁?

  28. 28

    为什么重新使用条件变量的互斥锁会导致死锁?

  29. 29

    Dispatcher.Invoke更新WPF画布会导致性能问题

热门标签

归档