Проанализируйте API concurency::task() и зачем нам это?

Я пытаюсь понять синтаксис параллелизма:: задачи в приведенном ниже фрагменте кода.

Я не могу понять этот синтаксис кода. Как мы анализируем это:

Что такое "getFileOperation" здесь. Это объект типа StorageFile класса? Что здесь означает ключевое слово "тогда"? После этого есть "{" (....)? Я не могу проанализировать этот синтаксис?

Кроме того, зачем нам этот параллелизм::task(). Then().. Вариант использования?

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

Взято из параллельного интерфейса MSDN :: 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 ответ

Решение

getFileOperation это объект, который будет возвращать StorageFile^ (или ошибка) в какой-то момент в будущем. Это C++ task<t> обертка вокруг WinRT IAsyncOperation<T> объект вернулся из GetFileAsync,

Реализация GetFileAsync может (но не обязан) выполнять в другом потоке, позволяя вызывающему потоку продолжать выполнять другую работу (например, анимацию пользовательского интерфейса или реагирование на ввод пользователя).

then Метод позволяет передавать функцию продолжения, которая будет вызываться после завершения асинхронной операции. В этом случае вы передаете лямбду (встроенную анонимную функцию), которая определяется [] квадратные скобки, за которыми следует список параметров лямбда (StorageFile^объект, который будет возвращен GetFileAsync), а затем функции тела. Это тело функции будет выполнено, как только GetFileAsync операция завершает свою работу когда-нибудь в будущем.

Код внутри функции продолжения передается then обычно (но не всегда) выполняется после кода, следующего за вызовом create_task() (или в вашем случае task конструктор).

Другие вопросы по тегам