UWP / WinRT: Как выполнить задачу пользовательского интерфейса после завершения асинхронной операции в модели?

Я следую шаблону MVVM, и у меня есть модель под названием DocumentStore, У класса есть метод следующим образом:

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 завершено, то есть после обработки fileContents.

Есть ли способ для моей модели уведомить заинтересованных слушателей, что задача выполнена?

Или должна моя модель Open_Document метод на самом деле сам по себе является асинхронным? Однако мне нужно обработать структуру данных внутри задачи, и не приведет ли это к тому, что мой метод будет запущен в другом контексте потока?

Я работаю в C ++ / CX, но приму любую возможную помощь.

0

Решение

Если я правильно понимаю, процесс будет следующим.

Откройте файл -> прочитать содержимое -> обработать содержимое -> сделать STH еще.

Вы можете перенести асинхронную операцию в цепочку задач и создать новую асинхронную операцию с помощью метода 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");
});
1

Другие решения

Я публикую то, чем закончил, но принял ответ Джеффри Чена, так как он помог мне туда добраться.

Моя модель теперь имеет событие DocOpened, Это уволено после завершения Open_Document, Я подписал свою ViewModel на это событие с помощью обработчика, который способен выполнять задачи при каждом запуске этого события.

0

По вопросам рекламы [email protected]