从WinRT中的异步任务lambda更新UI

时间:2014-07-16 18:21:38

标签: c++ wpf asynchronous windows-runtime c++-cx

我正在编写一个小的WinRT程序来异步创建一个文件夹和一个文件。简化的代码如下:

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...

等。

如何从Async任务访问UI元素?这样做的最佳做法是什么?

2 个答案:

答案 0 :(得分:2)

您需要从UI线程更新UI。我刚才写了一篇关于从不同类型的Windows Phone应用程序获取UI线程的帖子,它也应该适用于Windows RT应用程序: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/

答案 1 :(得分:1)

您可以捕获UI元素变量并在lambda体中更新它。