UWP应用权限对话框无法点击,请求授权时应用冻结问题排查
解决UWP进程列表权限请求对话框冻结的问题
兄弟,我之前踩过一模一样的坑!你遇到的权限对话框点不动、应用直接冻结的情况,90%是UI线程被同步操作阻塞导致的死锁——权限请求对话框需要UI线程响应交互,但你的按钮点击事件里如果直接同步执行了获取进程的代码,就会把UI线程卡死,对话框自然没法操作。
下面给你一步步解决:
1. 用异步操作解放UI线程
把获取进程的逻辑全部改成异步,用async/await,绝对别在UI线程同步跑耗时操作。给你写个正确的按钮点击示例:
private async void GetProcessesBtn_Click(object sender, RoutedEventArgs e) { // 先异步请求权限,这一步不会阻塞UI var accessStatus = await AppDiagnosticInfo.RequestAccessAsync(); if (accessStatus == AppDiagnosticInfoAccessStatus.Allowed) { // 把获取进程的操作放到后台线程,避免卡UI var allProcesses = await Task.Run(() => { return AppDiagnosticInfo.GetForAppDiagnosticInfos(); }); // 更新UI必须回到UI线程,用DispatcherQueue DispatcherQueue.TryEnqueue(() => { // 比如把进程名绑定到ListView ProcessListView.ItemsSource = allProcesses.Select(p => p.AppInfo.DisplayName); }); } else { // 处理权限被拒的情况 await new MessageDialog("权限被拒绝,无法获取进程列表").ShowAsync(); } }
2. 检查应用清单的权限声明是否正确
你已经用了rescap命名空间,要确保appDiagnostics能力的写法没毛病,位置也不能错:
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap mp rescap"> <!-- 其他清单内容(比如Identity、Properties这些) --> <Capabilities> <Capability Name="internetClient" /> <!-- 注意是rescap前缀的Capability --> <rescap:Capability Name="appDiagnostics" /> </Capabilities> </Package>
提一句:appDiagnostics是受限能力,要是以后要上架商店,得额外提交权限申请,但本地调试只要清单对就能触发权限框。
3. 权限请求期间别碰UI
在RequestAccessAsync完成前,别尝试更新UI或者跑其他需要UI线程的任务,不然很容易触发死锁。
4. 调试排查小技巧
要是还冻结,打开Visual Studio的线程窗口(调试→窗口→线程),找到UI线程,看它的调用栈,是不是卡在某个同步方法上——大概率能找到阻塞的根源。
内容的提问来源于stack exchange,提问作者neo
相关产品推荐
相关产品推荐

