我知道一个 lambda 的返回值被输入到下一个 lambda 的参数中。但是,如果需要传递多条数据,或者程序结构已经设置了一个 lambda 的返回类型怎么办?
这是我的工作代码,其中两种情况都是打开文件选择器,然后将其内容作为文本读取,同时记住它来自什么文件:
create_task(picker->PickSingleFileAsync())
.then([this](StorageFile^ file)
{
if (file == nullptr) cancel_current_task();
m_OpenFilename = file->Name;
return FileIO::ReadTextAsync(file);
})
.then([this](String^ fileContents)
{
//do something with the filename and file contents
});
请注意,为了完成这项工作,我需要添加一个类变量来存储异步任务之间的文件名。这让我觉得很糟糕,原因有很多:
- 有一个类变量供内部使用单个方法是丑陋的
- 它是线程安全的吗?如果有人疯狂地打开文件选择器和选择文件,这些异步任务在访问 m_OpenFilename 时是否会相互破坏?
- 这只是一个带有一个变量的简单示例,但假设我还想跟踪文件的路径、文件属性以及许多其他特征。现在,随着类变量数量的增加,该类看起来越来越丑陋。
我的第一种方法是在函数范围内设置一个局部变量,并通过将它们的捕获列表更改为将其传递给每个 lambda 函数[this, OpenFilename]
。但是,这会失败,因为在 lambda 执行时,C++/CX 的后台内存处理程序已经被丢弃Openfilename
,导致访问它时出现访问冲突。
在我的示例中,如何将文件的元数据传递给结果,ReadTextAsync
以便我可以同时访问文件及其内容?