作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当在不同线程上多次调用 Windows.Storage.StorageFolder.GetFolderFromPathAsync 时,我收到 ArgumentExceptions。这是一个重现该问题的测试:
[TestMethod]
public async Task ConcurrentGetFolderFromPath()
{
List<Task> tasks = new List<Task>();
for (int i = 0; i < 10; i++)
{
var task = Task.Run(async () =>
{
string localFolderPath = Windows.Storage.ApplicationData.Current.LocalFolder.Path;
//await Task.Yield();
var folder = await Windows.Storage.StorageFolder.GetFolderFromPathAsync(localFolderPath);
});
tasks.Add(task);
}
await Task.WhenAll(tasks);
}
System.ArgumentException: Value does not fall within the expected range.
Result StackTrace:
at Windows.Storage.StorageFolder.GetFolderFromPathAsync(String path)
at PCLStorage.Test.FolderTests.<<ConcurrentGetFolderFromPath>b__53>d__55.MoveNext() in c:\git\pclstorage\test\PCLStorage.Test\FolderTests.cs:line 205
最佳答案
好的,所以这里的问题是 Task.Run
之一以及它的处理方式 async delegates
.基本上,当你说:
Task.Run(async () => ...)
Task
你期待它。它返回包含在另一个任务中的任务,即任务。因此,为了获得您正在寻找的任务(检索 StorageFolder 的任务),您需要
await
外部任务。您可以通过更改何时将其添加到
tasks
来简单地做到这一点。列表:
tasks.Add(await task);
AccessExceptions
.它也可能不是。这样做时我会很小心。
Controller
中。 .这让我可以做的是写一个
LocalStorageController
仅用于单元测试,它允许我对内存中的文件系统执行所有 IO(基本上是一个简单的
Dictionary<string, byte[]>
)。这确实使测试复杂的文件树更加困难,但您也可以使用不同的数据结构(例如实际的
Tree
)来为您的文件系统建模。
关于.net - 同时调用 StorageFolder.GetFolderFromPathAsync 时出现 ArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16889890/
我正在制作一个 Windows 10 通用应用程序,我希望用户选择一个文件夹来保存该应用程序的文档文件。此文件夹的路径保存到 ApplicationData.Current.RoamingSettin
当在不同线程上多次调用 Windows.Storage.StorageFolder.GetFolderFromPathAsync 时,我收到 ArgumentExceptions。这是一个重现该问题的
我尝试从网络位置读取文件。但我不断收到 UnAuthorizedAccessException。 我通过 StorageFolder.GetFolderFromPathAsync 选择 Storage
我是一名优秀的程序员,十分优秀!