2014-07-16 101 views
0

我正在寫一個小的WinRT程序來異步創建一個文件夾和一個文件。簡化的代碼如下所示:從WinRT異步任務lambda更新UI

auto createFolderOp = ApplicationData::Current->LocalFolder->CreateFolderAsync(L"DummyFolder", CreationCollisionOption::OpenIfExists); 

create_task(createFolderOp).then([](task<StorageFolder ^> folder) 
{ 
    StorageFolder ^tempFolder; 

    tempFolder = uploadFolder.get(); 

    return tempFolder->CreateFileAsync(L"DummyFile.txt", CreationCollisionOption::ReplaceExisting); 

}).then([] (task<StorageFile ^> dummyFile) 
{ 
    StorageFile ^file; 

    file = dummyFile.get(); 

    FileIO::WriteTextAsync(file, L"Dummy Content"); 
}); 

在執行此代碼期間,我想更新我的每個步驟的UI。比如我有一個文本塊,並在每一步我想更新以顯示不同的文字,如:

Create Folder Succeed... 
Create File Succeed... 
Write File Succeed... 

如何訪問從異步任務UI元素?這樣做的最佳做法是什麼?

+0

'什麼是這樣做的最佳做法' - ?閱讀[數據綁定](http://msdn.microsoft.com/en-us/library/ms752347(v = vs.110).aspx)。 –

回答

1

您可以捕獲UI元素變量並在lambda體中更新它。

+0

以爲我會在這一點上展開。在任務繼續中,您可以通過對象或指針捕獲變量。你總是可以通過'.then([this](...)''將'this'傳遞給你的繼續。我注意到intellisense並不總是接受UI元素,但如果你輸入名字並遵循它與' - >',它通常會繼續。 備註:http://stackoverflow.com/questions/15119897/exception-handling-winrt-c-concurrency-async-tasks?rq=1 < - info關於處理任務中的錯誤。 – user3164339

2

您需要從UI線程更新UI。我前一段時間寫了一篇關於從不同類型的Windows Phone應用程序進入UI線程的帖子,它也應該適用於Windows RT Apps:http://robwirving.com/2013/07/17/guide-to-getting-to-the-ui-thread-for-any-type-of-windows-phone-8-app/

如果您使用Windows Xaml,您應該能夠從CoreWindow對象獲取Dispatcher並使用調度程序的RunAsync方法運行lambda。

如果你試圖去從的WinRT組件的UI線程,那麼這是一個有點困難,但我這裏有一個方法:http://robwirving.com/2014/06/02/getting-to-the-ui-thread-from-a-windows-phone-winrt-component/