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

C++ 从WinRT中的异步任务lambda更新UI,c++,wpf,asynchronous,windows-runtime,c++-cx,C++,Wpf,Asynchronous,Windows Runtime,C++ Cx,我正在写一个小WinRT程序来异步创建一个文件夹和一个文件。简化代码如下所示: auto createFolderOp = ApplicationData::Current->LocalFolder->CreateFolderAsync(L"DummyFolder", CreationCollisionOption::OpenIfExists); create_task(createFolderOp).then([](task<StorageFolder ^> fold

我正在写一个小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元素?执行此操作的最佳实践是什么?

您只需捕获UI元素变量并在lambda主体中更新它。

您只需捕获UI元素变量并在lambda主体中更新它。

您需要从UI线程更新UI。我不久前写了一篇关于从不同类型的Windows Phone应用程序访问UI线程的帖子,它也应该适用于Windows RT应用程序:

如果您使用的是Windows Xaml,那么您应该能够从CoreWindow对象获取Dispatcher,并使用Dispatcher的方法运行lambda


如果您试图从WinRT组件访问UI线程,那么这有点困难,但我这里有一个方法:

您需要从UI线程更新UI。我不久前写了一篇关于从不同类型的Windows Phone应用程序访问UI线程的帖子,它也应该适用于Windows RT应用程序:

如果您使用的是Windows Xaml,那么您应该能够从CoreWindow对象获取Dispatcher,并使用Dispatcher的方法运行lambda


如果您试图从WinRT组件访问UI线程,那么这有点困难,但我有一个方法:

这样做的最佳实践是什么?
-阅读。
这样做的最佳实践是什么?
-阅读。我想我会对此进行一点扩展。在任务继续中,可以通过对象或指针捕获变量。您总是可以通过
传递给您的延续。然后([此](…)
。我注意到intellisense并不总是关注UI元素,但如果您键入名称并在名称后面加上
->
,它通常会流行起来。旁注:我想我会对此进行一点扩展。在任务继续中,您可以通过对象或指针捕获变量。您可以始终传递
将通过
继续。然后([这](…)
。我注意到intellisense并不总是能够识别UI元素,但如果您键入名称并在其后面加上
->
,它通常会流行起来。旁注:
Create Folder Succeed...
Create File Succeed...
Write File Succeed...