知道了。由于某些奇怪的原因,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 之外。因此,只能从工作线程访问代理文件(通过本机异步方法或通过专用工作线程上的同步方法)。