Я следую шаблону 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, но приму любую возможную помощь.
Если я правильно понимаю, процесс будет следующим.
Откройте файл -> прочитать содержимое -> обработать содержимое -> сделать 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");
});
Я публикую то, чем закончил, но принял ответ Джеффри Чена, так как он помог мне туда добраться.
Моя модель теперь имеет событие DocOpened
, Это уволено после завершения Open_Document
, Я подписал свою ViewModel на это событие с помощью обработчика, который способен выполнять задачи при каждом запуске этого события.