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 订阅到此事件,该处理程序能够在该事件被触发时执行任务。