c# - 使用任务构造函数时无法使用结果启动任务

标签 c# windows-runtime windows-phone windows-store-apps async-await

我有一堆任务要按顺序运行。问题是,它们涉及大量的磁盘读取,我需要在使用每个磁盘之间进行一些磁盘读取/写入,所以我希望能够创建一堆任务来从磁盘读取(并返回结果),但在我准备好之前不要启动它们。

因此,我无法使用 Task.RunTask.Factory.StartNew .据我了解,这就是 Task 的内容。构造函数是为了。

例如:

public async Task<IEnumberable<Task<byte[]>>> ReadAllFiles()
{
    var folder = await ApplicationData.Current.LocalFolder;
    var files = await folder.GetFilesAsync();
    var fileTasks = files.Select(
        file => new Task<Task<byte[]>>(
            async () => {
                return (await FileIO.ReadBufferAsync(file)).ToArray();
            }).Unwrap());
    return fileTasks;
}

然后,在我的调用方法中我可以去:

var readTasks = await ReadAllFiles();
foreach(var task in readTasks)
{
    task.Start(); // Throws exception
    var bytes = await task; // If the previous line is commented out, does not return
    // Do other stuff
}

有什么办法吗?现在 task.Start() 抛出异常:System.InvalidOperationException: Additional information: Start may not be called on a promise-style task. .

编辑:应该注意的是,它目前的外观有些奇怪。这是因为在读取文件等每个步骤中,我在返回数据之前都对数据进行了一些额外的逻辑处理。这应该不会影响代码,只要我可以在 Task 构造函数方法中进行异步调用即可。

Edit2:似乎有人希望我更清楚地了解我的问题。

有没有一种方法可以创建一个有返回值的任务,但不启动它(可能使用 Task<TResult> constructor ),这样我就可以启动它并在另一个时间等待该值。目前我收到了上述异常(exception)情况。

最佳答案

我好像明白了。基于this answer .

看来我需要保留一份外部 Task 的副本并单独对其调用 Task.Start,然后我才能按预期返回 Unwrapped 任务。示例:

public async Task<IEnumberable<Task<byte[]>>> ReadAllFiles()
{
    var folder = await ApplicationData.Current.LocalFolder;
    var files = await folder.GetFilesAsync();
    var fileTasks = files.Select(
        file => {
            var wrappedTask = new Task<Task<byte[]>>(
            async () => {
                return (await FileIO.ReadBufferAsync(file)).ToArray();
            });

            var unwrappedTask = wrappedTask.Unwrap();
            wrappedTask.Start();
            return unwrappedTask;
        });
    return fileTasks;
}

这确保解包已经完成并安排内部任务(但不启动它)。

关于c# - 使用任务构造函数时无法使用结果启动任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26320185/

相关文章:

c# - C# 的多个异常的 XML 文档

c# - 在WinRT MVVM中无法执行按钮单击和组合框选择更改

c# - 如何为 ListBoxItems 设置不同的 Horizo​​ntalAlignment

c# - Windows Phone 闹钟不断自行重新开启

c# - 在 WPF 中,应按名称或使用绑定(bind)更改属性

c# - ADO.NET 实体数据模型 BUG

c# - 设置机器时间C#

c# - 如何正确提供 PDF 文件

wpf - 在 Windows 桌面和 Windows 商店应用程序之间共享字符串资源

windows - 如何在 Powershell 中引用 WinRT 组件