2015-08-14 14 views
0

我遵循MVVM模式,並有一個名爲DocumentStore的模型。這個類有一個方法如下:UWP/WinRT:如何在完成模型中的異步操作後執行UI任務?

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 
    }); 
} 

我的視圖模型被彈出一個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

您是否考慮過將lambda傳遞給'OpenDocument',可以在異步工作完成後調用? – WiredPrairie

回答

1

如果我理解正確,過程如下。

打開文件 - >閱讀內容 - >處理內容 - >做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"); 
}); 
+0

在我的情況下,讀取文件和處理文本步驟正在發生在另一個類,一個模型。 ViewModel會在完成文本處理後執行任務(例如,打開一個對話框,通知用戶在文本中發現了什麼內容)。我相信這與您當前獲得「Do STH else」的代碼僅在「處理文本:」完成後才能執行的代碼類似。如果我沒有弄錯,在你當前的代碼中,「Do STH else」可能會在「處理文本:」之前發生,因爲create_async的返回會立即返回,對嗎? –

+0

不,在「處理文本」之後會發生「Do STH else」,我使用task.get()來確保它。 –

+0

啊,謝謝你,沒有意識到。那麼你是否有任何想法來解決這個問題,以適應將模型從ViewModel中分離出來的代碼?我使用ViewModel中的示例代碼更新了這個問題,以使討論更加簡單。 ViewModel中的調用代碼將無法訪問任務對象來調用task.get(),至少不是直接調用。我可以讓模型中的Open_Document返回任務對象,儘管這打破了MVVM模型的精神。你認爲什麼是編碼這種交互的正確方式? –

0

,但我接受傑弗裏陳的答案,因爲它幫助我到達那裏。

我的模型現在有一個事件DocOpened。這是完成Open_Document後被解僱。我用一個處理程序來訂閱我的ViewModel到這個事件,這個處理程序能夠在該事件被觸發時執行任務。

相關問題