WPF Dispatcher使用invoke,程序进入死锁

两个后台线程中使用同一个Dispatcher invoke进行dialog展示,其中dialog中设置定时关闭窗口,这时会导致进入死锁状态

调用dialog代码:

Dispatcher dispatcher = Application.Current.Dispatcher;
            Task.Run(() =>
            {
                dispatcher.Invoke(() =>
                {
                    _dialogService.ShowDialog("VerifyDialog", new DialogParameters(), null);
                });
            });

            Task.Run(() =>
            {
                dispatcher.Invoke(() =>
                {
                    _dialogService.ShowDialog("VerifyDialog", new DialogParameters(), null);
                });
            });

dialog定时关闭代码:

public async void AutoCloseDialog()
        {     
            await Task.Delay(1000);
            RequestClose?.Invoke(new DialogResult(ButtonResult.None));
        }

Dispatcher 改成InvokeAsync并等待无效果,同样会进入死锁

Dispatcher dispatcher = Application.Current.Dispatcher;
            Task.Run(() =>
            {
                dispatcher.InvokeAsync(() =>
                {
                    _dialogService.ShowDialog("VerifyDialog", new DialogParameters(), null);
                }).Wait();
            });

            Task.Run(() =>
            {
                dispatcher.InvokeAsync(() =>
                {
                    _dialogService.ShowDialog("VerifyDialog", new DialogParameters(), null);
                }).Wait();
            });

目前没有找到很好的解决方法,只能设置一个全局变量对dialog是否关闭进行监控和阻塞

 Dispatcher dispatcher = Application.Current.Dispatcher;
            Task.Run(() =>
            {
                dispatcher.InvokeAsync(() =>
                {
                    _dialogService.ShowDialog("VerifyDialog", new DialogParameters(), null);
                });
                while(!flag)
                {
                    Thread.Sleep(10);
                }
            });

            Task.Run(() =>
            {
                dispatcher.InvokeAsync(() =>
                {
                    _dialogService.ShowDialog("VerifyDialog", new DialogParameters(), null);
                }).Wait();
                while (!flag)
                {
                    Thread.Sleep(10);
                }
            });
 public async void AutoCloseDialog()
        {     
            await Task.Delay(1000);
            flag = true;
            RequestClose?.Invoke(new DialogResult(ButtonResult.None));
        }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值