分析concurrency :: task()API&我们为什么需要这个?

时间:2015-04-01 13:44:44

标签: c++ windows-runtime c++-cx windows-rt concurrency-runtime

我试图在下面的代码片段中理解concurrency :: task的语法。

我无法理解此代码段语法。 我们如何分析这个:

  

这里的“getFileOperation”是什么。它是StorageFile类型的对象   上课? “then”关键字在这里意味着什么?之后有一个“{”   然后(....)?我无法分析这种语法?

为什么我们需要这个并发:: task()。then()..用例?

concurrency::task<Windows::Storage::StorageFile^> getFileOperation(installFolder->GetFileAsync("images\\test.png"));
   getFileOperation.then([](Windows::Storage::StorageFile^ file)
   {
      if (file != nullptr)
      {

取自MSDN concurrency::task API

void MainPage::DefaultLaunch()
{
   auto installFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;

   concurrency::task<Windows::Storage::StorageFile^> getFileOperation(installFolder->GetFileAsync("images\\test.png"));
   getFileOperation.then([](Windows::Storage::StorageFile^ file)
   {
      if (file != nullptr)
      {
         // Set the option to show the picker
         auto launchOptions = ref new Windows::System::LauncherOptions();
         launchOptions->DisplayApplicationPicker = true;

         // Launch the retrieved file
         concurrency::task<bool> launchFileOperation(Windows::System::Launcher::LaunchFileAsync(file, launchOptions));
         launchFileOperation.then([](bool success)
         {
            if (success)
            {
               // File launched
            }
            else
            {
               // File launch failed
            }
         });
      }
      else
      {
         // Could not find file
      }
   });
}

1 个答案:

答案 0 :(得分:1)

getFileOperation是一个将在未来的某个时刻返回StorageFile^(或错误)的对象。它是围绕从task<t>返回的WinRT IAsyncOperation<T>对象的C ++ GetFileAsync包装。

GetFileAsync的实现可以(但不是必须)在不同的线程上执行,允许调用线程继续做其他工作(比如动画UI或响应用户输入)。 / p>

then方法允许您传递将在异步操作完成后调用的延续函数。在这种情况下,您传递一个lambda(内联匿名函数),该函数由[]方括号后跟lambda参数列表(StorageFile^标识,该对象将返回GetFileAsync)然后是函数体。一旦GetFileAsync操作在将来的某个时间完成其工作,将执行此函数体。

传递给then的延续函数中的代码通常(但不总是)执行之后调用create_task()之后的代码(或者在您的情况下为{ {1}}构造函数)。