UWP/WinRT: 如何在模型中完成异步操作后执行UI任务?
UWP/WinRT: How to perform a UI task upon completion of an asynchronous operation in a model?
我正在遵循 MVVM 模式,并且有一个名为 DocumentStore
的模型。 class有一个方法如下:
void DocumentStore::Open_Document(StorageFile^ file) {
create_task(FileIO::ReadTextAsync(file))
.then([this, file](String^ fileContents)
{
// Take the fileContents and add them to internal data structure
});
}
我的 ViewModel 正在弹出一个 FileOpenPicker
以获取一个文件,然后将其作为参数提供给 Open_Document
:
create_task(picker->PickSingleFileAsync())
.then([this](StorageFile^ file)
{
m_DocStore->Open_Document(file);
// Target location to do something
}
);
我希望能够在 Open_Document
中的任务完成后执行操作,即在处理完文件内容后。
我的模型有没有办法通知任何感兴趣的听众任务已完成?
或者我模型的 Open_Document
方法本身应该是异步的吗?但是,我需要在任务中处理数据结构,这不会导致我的方法在不同的线程上下文中 运行 吗?
我正在使用 C++/CX,但我会接受任何我能得到的帮助。
如果我没理解错的话,流程如下
打开文件 -> 读取内容 -> 处理内容 -> 做其他事情。
您可以将异步操作推送到任务链,并使用 create_async 方法创建一个新的异步操作。
以下代码供您参考:
create_task(StorageFile::GetFileFromApplicationUriAsync(ref new Windows::Foundation::Uri("ms-appx:///Assets/XMLFile.xml")))
.then([](StorageFile^ file) {
WriteLine("Read the file");
return FileIO::ReadTextAsync(file);
}).then([](task<String^> task) {
String ^ text = task.get();
WriteLine("Content: " + text);
return create_async([text]() {
WriteLine("Process the text: " + text);
});
}).then([](task<void> task) {
task.get();
WriteLine("Do STH else");
});
我发布了我最终的结果,但我接受了 Jeffrey Chen 的回答,因为它帮助我到达那里。
我的模型现在有一个事件 DocOpened
。这是在 Open_Document
完成时触发的。我使用一个处理程序将我的 ViewModel 订阅到此事件,该处理程序能够在该事件被触发时执行任务。
我正在遵循 MVVM 模式,并且有一个名为 DocumentStore
的模型。 class有一个方法如下:
void DocumentStore::Open_Document(StorageFile^ file) {
create_task(FileIO::ReadTextAsync(file))
.then([this, file](String^ fileContents)
{
// Take the fileContents and add them to internal data structure
});
}
我的 ViewModel 正在弹出一个 FileOpenPicker
以获取一个文件,然后将其作为参数提供给 Open_Document
:
create_task(picker->PickSingleFileAsync())
.then([this](StorageFile^ file)
{
m_DocStore->Open_Document(file);
// Target location to do something
}
);
我希望能够在 Open_Document
中的任务完成后执行操作,即在处理完文件内容后。
我的模型有没有办法通知任何感兴趣的听众任务已完成?
或者我模型的 Open_Document
方法本身应该是异步的吗?但是,我需要在任务中处理数据结构,这不会导致我的方法在不同的线程上下文中 运行 吗?
我正在使用 C++/CX,但我会接受任何我能得到的帮助。
如果我没理解错的话,流程如下
打开文件 -> 读取内容 -> 处理内容 -> 做其他事情。
您可以将异步操作推送到任务链,并使用 create_async 方法创建一个新的异步操作。
以下代码供您参考:
create_task(StorageFile::GetFileFromApplicationUriAsync(ref new Windows::Foundation::Uri("ms-appx:///Assets/XMLFile.xml")))
.then([](StorageFile^ file) {
WriteLine("Read the file");
return FileIO::ReadTextAsync(file);
}).then([](task<String^> task) {
String ^ text = task.get();
WriteLine("Content: " + text);
return create_async([text]() {
WriteLine("Process the text: " + text);
});
}).then([](task<void> task) {
task.get();
WriteLine("Do STH else");
});
我发布了我最终的结果,但我接受了 Jeffrey Chen 的回答,因为它帮助我到达那里。
我的模型现在有一个事件 DocOpened
。这是在 Open_Document
完成时触发的。我使用一个处理程序将我的 ViewModel 订阅到此事件,该处理程序能够在该事件被触发时执行任务。