在 UWP 应用程序中,如何重现异常,告知仅在非 UI 线程上允许同步 UI

2024-03-15

我无法弄清楚不同类型的线程在 UWP 应用程序中的行为方式。首先,在 UWP 中,UI 线程似乎不是主线程,而是工作线程之一(当我在事件处理程序中插入断点等时,我在调试器中看到了这一点)。我的假设是CoreApplication.MainView.CoreWindow.Dispatcher.HasThreadAccess指定当前线程是否为 UI 线程。

根据我的理解,某些操作应该根据当前线程的类型而表现不同。特别是,同步 I/O 方法应引发 UI 线程上不允许同步 I/O 的异常。

例如,File.Exists、File.Move 或使用 FileStream 构造函数创建文件。我什至早些时候就遇到过这些异常,但现在不知道如何再次重现它们。他们都神秘地消失了。即使我将这些方法直接放在 Button.Click 处理程序中(我相信它在 UI 线程上执行)HasThreadAccess是真的),它们仍然有效。

我相信这段代码在 2016 年 12 月我上次测试时一直抛出 InvalidOperationException:

private async void button_Click(object sender, RoutedEventArgs e)
{
    if (File.Exists(Path.Combine(ApplicationData.Current.LocalFolder.Path, "log.txt")))
    {
    }

或者,也许代码很接近但不等于,也许我遗漏了一些重要的细节..

我需要找到一种方法使这些异常再次可靠地发生,以便我可以正确地将旧的同步库重构为异步并彻底测试它。如果没有抛出异常,我实际上无法确定在其他人的系统上该库不会由于这些 I/O 线程问题而崩溃。


知道了。由于某些奇怪的原因,System.IO 命名空间的同步方法对于不同位置的磁盘文件夹的行为不同(在线程方面)。

这有效:

FileStream fs = new FileStream(Path.Combine(ApplicationData.Current.LocalFolder.Path, "log.txt"), FileMode.OpenOrCreate);

以下崩溃并显示“System.InvalidOperationException”和消息“不应在 UI 线程上执行同步操作”。考虑将此方法包装在 Task.Run 中:

FileStream fs = new FileStream(@"C:\Temp\log.txt", FileMode.OpenOrCreate);

同时,如果我在工作线程而不是 UI 线程上运行后者,我会得到准确的 UnauthorizedAccessException 告诉我访问被拒绝。

IE。似乎禁止在 UI 线程上运行同步操作并不涉及允许此 I/O 的文件夹(至少是 ApplicationData.Current.LocalFolder),并且确实涉及不允许此 I/O 的文件夹。也许 UWP 的 .NET 代码中存在引发错误异常的错误?

这很奇怪,因为我认为线程和访问控制问题之间应该没有关系,但至少我找到了一种方法让 UWP 同步方法以我需要的方式崩溃。

EDIT:

事实证明这是正确且预期的行为。在 UI 线程上时,WinRT 甚至不会尝试访问 LocalFolder 外部的资源,因为这会导致内部死锁(这就是 WinRT 在幕后工作的方式)。对于 LocalFolder 访问,允许使用 UI 线程进行同步 I/O。这就是为什么仅当访问 LocalFolder 外部的资源时,我才会在 UI 线程上收到 InvalidOperationException(而不是 UnauthorizedAccessException)。

UI 线程的问题在于像文件选择器这样的对象,它可以返回 LocalFolder(代理文件)之外的位置。在工作线程上访问此类文件不会抛出 UnauthorizedAccessException 并且会正常进行,但在 UI 线程上我们会收到 InvalidOperationException,因为该文件位于 LocalFolder 之外。因此,只能从工作线程访问代理文件(通过本机异步方法或通过专用工作线程上的同步方法)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 UWP 应用程序中,如何重现异常,告知仅在非 UI 线程上允许同步 UI 的相关文章

  • 金特 + XNA (C#)

    是否可以使用jint http jint codeplex com操作使用 XNA C 创建的 3D 环境 并向该环境添加功能 再次使用 jint 作为 Jint 的贡献者 我会推荐你Jint http jint codeplex com
  • c# 从另一个类中的另一个静态事件引发事件

    需要帮助从另一个班级调用事件 我有已声明事件的课程 public class MxPBaseGridView GridView public event AddNewItemsToPopUpMenuEventHandler AddNewIt
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • 如何以编程方式播放 16 位 pcm 数组 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含 16 位 pcm 值的短 数组 我希望能够在不添加任何标题 也不将任何文件保存到内存的情况下播放它 我知道我可能需要一个提供
  • 将下拉列表与字典绑定

    我将字典绑定到下拉列表 举例来说 我的字典中有以下项目 Test1 123 Test2 321 我希望下拉文本采用以下格式 Test1 Count 123 Test2 Count 321 我沿着以下路径走 但没有运气 MyDropDown
  • 全局使用和 .NET Standard 2.0

    我最近意识到我可以使用 C 10 功能文件范围的命名空间在 NET Standard 2 0 项目中也可以通过设置
  • 通过 C# Mailkit / Mimekit 发送电子邮件,但出现服务器证书错误

    Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 1 18 1 1 从我自己的电子邮件服务器发送电子邮件 2 电子邮件服务器具有不受信任的自签名证书 3 我在代码中添加了以下两行 以忽略服务器证
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • 使用 xslt 将 xml 转换为 xsl-fo 时动态创建超链接?

    我想使用 xsl 文件在 PDF 报告中创建标题 如果源文件包含超链接 则应将其呈现为超链接 否则呈现为纯文本 例如 我的 xml 如下所示 a href http google com target blank This is the h
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • Autoconf 问题:“错误:C 编译器无法创建可执行文件”

    我正在尝试使用 GNU 自动工具构建一个用 C 编写的程序 但显然我设置错误 因为当configure运行 它吐出 configure error C compiler cannot create executables 如果我看进去con
  • 在哪里可以下载没有 Visual Studio 2010 的 C# 4.0 编译器?

    我知道 CTP VS 2010 映像 但我可以只下载 NET Framework 4 0 和 C 编译器吗 AFAIK VS 2010 CTP 仅作为 VM 映像提供 我不相信 Microsoft 发布了 VS 的安装程序 其中一个绝对不适
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set
  • 将 Swagger 与命名空间版本的 WebApi 结合使用

    我已经找到了如何使用基于名称空间的 WebAPI 版本这个班 https aspnet codeplex com SourceControl changeset view dd207952fa86 Samples WebApi Namesp
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima

随机推荐

  • 解码ima4音频格式

    为了减少 iPhone 应用程序的下载大小 我压缩了一些音频文件 具体来说 我在命令行上使用 afconvert 将 wav 格式更改为 caf 格式 带 ima4 压缩 我读了this http www wooji juice com b
  • 带有循环动画的浓缩咖啡冻结视图

    我有一个视图 其中一个元素在无限循环中使用以下内容进行动画处理
  • Django REST Framework 添加一个 ViewSet 作为另一个 ViewSet 上的详细信息

    我有两种模型 一种是盒子 一种是盒子评论 class BoxViewSet viewsets ModelViewSet queryset Box objects all permission classes IsAuthenticated
  • 如何将相机附加到 Spark.components.VideoDisplay

    我正在使用 Flash Builder 并创建了一个 Spark 应用程序 Flex 项目 该项目将从本地摄像头传输视频 如果我使用mx controls VideoDisplay 没有问题 因为它有attachCamera camera
  • 使用 QEMU 模拟 Big Endian ARM 系统

    是否可以编译一些 Linux 内核并通过 QEMU 运行它 模拟一些 Big Endian ARM 处理器 如果 QEMU 无法做到这一点 我很想知道其他可以做到这一点的系统模拟器 我的基本目标是在尽可能多的本机环境中运行和调试专用的 Bi
  • 从字符串中删除点符号[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 JavaScript 中替换字符串中的所有点 https stackoverflow com questions 2390789 how to replace all points in a
  • Xamarin Forms Maps 将图像动态添加到 InfoWindow

    我已经从官方网站的示例中实现了自定义渲染器 但我确实需要每个引脚发送不同的图像 图像将通过 API 作为 base64 字符串传递 我真的需要 Android 和 iOS 的实现 案例场景 我正在将 CustomPins 加载到地图上 自定
  • 如何在PyQt5应用程序中显示来自moviepy的write_audiofile的转换进度?

    我想使用 moviepy 库中的 write audiofile 函数将 mp4 文件转换为 mp3 文件 并使用进度条在 PyQT5 应用程序中显示进度 当我使用时 mp4audio write audiofile filename lo
  • 网格单元格的边框在本机反应中并不统一

    我正在尝试使用 React Native 构建一个简单的计算器 I created a button component with borderWidth 0 5 and used this button component to form
  • 如何构建具有独立推理和训练部分的 TF 图?

    参考文献这个帖子 https stackoverflow com questions 40340807 how can i build a tf graph for both training and inference with tf t
  • 将枚举与字符串写入包裹

    我有这样的 Parcelable 枚举 public enum Option implements Parcelable DATA BASE TRIPS BIG PHOTOS OLD PHOTOS FILTERS IMAGES CATEGO
  • URL 变量中间的问号

    如果我有一个要传递 URL 的变量 并且其中有一个问号 我是否只需要转义该问号 如果没有 我怎样才能确保它像预期的那样通过 问号 URL 编码为 3F 但是您应该对整个事情使用适当的编码器 而不是手动编码字符
  • Google Chrome 地址栏在调整大小时消失

    在 MacOS Yosemite 上运行最新版本的 Google Chrome 版本 41 0 2272 101 64 位 时 当我调整地址栏大小时 地址栏会松开 并且必须重新启动 Google Chrome https www youtu
  • 如何计算图像有无噪声和几何畸变?

    我需要在 iPhone 中制作一个应用程序 需要计算图像中的噪声 几何变形和其他扭曲 这个怎么做 我用 opencv iphone 做了一些图像处理的东西 但我不知道如何计算这些参数 1 如何计算图像中的噪声 2 什么是几何变形以及如何计算
  • 如何在 iPhone 中显示 .tiff 图像?

    我想在我的本机 iphone 应用程序中显示来自服务器的 tiff 图像 是否可以在本机 iPhone 应用程序中显示 tiff 图像 我花了 2 个小时试图解决这个问题 但没有成功 我在网上搜索了近2个小时 没有解决这个问题 谁能帮我解决
  • 使用占位符时 PDO 执行速度较慢

    我正在制作一些返回计数和分组结果的 JSON 端点 对于此端点 我使用 PDO 和命名占位符 当使用命名占位符时 PHP 响应最多需要 6 秒的时间execute阶段 当执行相同的查询并将值直接放入查询中时 响应几乎是即时的 我正在更新仍使
  • 如何将openSSL生成的RSA公钥加载到RSACryptoServiceProvider中?

    我正在编写一个 Net 类 它从我们的中央身份验证服务器读取 cookie 它包含 UserId 一些时间戳和由 openssl sign 使用 2048 位 RSA 密钥和 SHA1 哈希创建的签名 当前的公钥在服务器上以 openssl
  • 调试器如何只查看变量的值而不是内存地址

    最近 我一直在 Visual Studio 中广泛使用结构和类 它们中的大多数都有很多值 这使得它们在调试时很难在监视窗口中跟踪 因为监视窗口和浮动监视窗口 您可以pin 不知道准确的术语 始终显示内存地址 这会模糊值的视图 有没有办法让监
  • Grunt 未定义

    刚开始使用 grunt 当我跑步时grunt我收到这个错误 Loading Gruntfile js tasks ERROR gt gt ReferenceError grunt is not defined 这是我的 Gruntfile
  • 在 UWP 应用程序中,如何重现异常,告知仅在非 UI 线程上允许同步 UI

    我无法弄清楚不同类型的线程在 UWP 应用程序中的行为方式 首先 在 UWP 中 UI 线程似乎不是主线程 而是工作线程之一 当我在事件处理程序中插入断点等时 我在调试器中看到了这一点 我的假设是CoreApplication MainVi