gpt4 book ai didi

.net - 同时调用 StorageFolder.GetFolderFromPathAsync 时出现 ArgumentException

转载 作者:行者123 更新时间:2023-12-01 11:55:42 24 4
gpt4 key购买 nike

当在不同线程上多次调用 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);
}

这是我得到的异常(exception):
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

当我单独运行它时,测试对我来说一直失败,但是当我与其余的 PCL Storage 一起运行它时通常会通过测试。

我在这里做错了吗? GetFolderFromPathAsync 或我使用的任何其他 API 是否只能从 UI 线程使用?或者这可能是 WinRT 存储 API 中的错误?

最佳答案

好的,所以这里的问题是 Task.Run 之一以及它的处理方式 async delegates .基本上,当你说:

Task.Run(async () => ...)

它返回给你的不是普通的简 Task你期待它。它返回包含在另一个任务中的任务,即任务。因此,为了获得您正在寻找的任务(检索 StorageFolder 的任务),您需要 await外部任务。您可以通过更改何时将其添加到 tasks 来简单地做到这一点。列表:
tasks.Add(await task);

现在,还有第二个问题。您可能同时从同一个文件夹中进行大量阅读。这可能会导致一些 AccessExceptions .它也可能不是。这样做时我会很小心。

我在 WinRT 的单元测试中执行文件读/写时遇到问题。幸运的是,我正在使用 Mvvm(通过 Mvvm Light)并将我的本地存储访问包裹在一个 Controller 中。 .这让我可以做的是写一个 LocalStorageController仅用于单元测试,它允许我对内存中的文件系统执行所有 IO(基本上是一个简单的 Dictionary<string, byte[]>)。这确实使测试复杂的文件树更加困难,但您也可以使用不同的数据结构(例如实际的 Tree )来为您的文件系统建模。

无论如何,我希望这会有所帮助。不过,我很抱歉在你问了这么久之后才问它。快乐编码!

关于.net - 同时调用 StorageFolder.GetFolderFromPathAsync 时出现 ArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16889890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com