Compartir a través de


Использование async/await без .NET Framework 4.5

[UPD: доступна для скачивания новая версия пакета NuGet Microsoft.Bcl.Async. Более ранняя версия некорректно работает с Windows Phone 7.1]

Вы хотите использовать ключевое слово await, но не желаете ждать выхода .NET Framework 4.5? Да этого и не нужно делать –– теперь await в вашем распоряжении.

Мы с гордостью сообщаем об обновлении предварительной версии дополнения  Async Targeting Pack. Предыдущая версия этого дополнения для Visual Studio 2012 позволяла использовать ключевое слово await при создании приложений для .NET Framework 4.0 и Silverlight 5, а обновленное дополнение дает возможность применять await в Visual Studio 2012 при создании приложений для любой из нижеперечисленных платформ (или более поздних их выпусков):

  • .NET Framework 4.0 (с обновлением KB2468871)
  • Silverlight 4
  • Windows Phone 7.5
  • и портируемых библиотек классов для этих платформ

Таким образом, фактически мы добавили поддержку Windows Phone 7.5, Silverlight 4 и портируемых библиотек классов.

Постойте –– но разве это не возможность языка?

И да, и нет. Представлять новые ключевые слова async и await как возможности языков C# и Visual Basic очень заманчиво. В какой-то мере это справедливо: значительная часть работы по применению ключевого слова await возлагается на компилятор.

Поэтому разработчики ждут, что смогут применять await в Visual Studio 2012 для любой версии платформы .NET, на которой будет работать приложение. Однако если вы представляете, как работают компоненты языка, то понимаете, что эта возможность не является сама собой разумеющейся. Многие конструкции языка полагаются на определенные функции API, предоставляемые платформой .NET. Например, для методов расширения необходим ExtensionAttribute, а foreach зависит от IEnumerable. Работа же ключевого слова await в обоих языках обеспечивается классом Task и дополнительными механизмами.

Что необходимо для использования await?

Для того чтобы использовать await, необходимы два компонента:

  1. Visual Studio 2012
  2. Некоторые специальные API платформы .NET

Если вы создаете приложение для одной из новейших платформ (например, .NET 4.5 или .NET для приложений Магазина Windows), то второй компонент –– специальные API –– автоматически доступен для этих платформ. Если вы разрабатываете приложение для платформ, созданных до Visual Studio 2012 (.NET Framework 4.0, Silverlight 4 или Windows Phone 7.5), то для получения этих API потребуется пакет NuGet.

Примечание. Разработчики приложений для мобильных платформ, скорее всего, уже знают, что Visual Studio 2012 пока не позволяет создавать подобные приложения. Следите за обновлениями. Более подробную информацию см. в этом посте.

Перед установкой пакетов убедитесь, что на вашем ПК установлен NuGet 2.1 или более поздняя версия .

Для того чтобы связать проект с пакетом NuGet, щелкните правой кнопкой на проекте, выберите Manage Package References (Управление ссылками на пакеты) и найдите строку Microsoft.Bcl.Async. Убедитесь, что слева активирована вкладка Online (Онлайн), а в раскрывающемся списке выбран пункт Include Prerelease (Добавить предварительные версии).

 

Разумеется, пакет можно установить из консоли диспетчера пакетов, выполнив следующую команду:

 install-package Microsoft.Bcl.Async –pre

Помните, что это предварительная версия пакета, а значит, в ее работе возможны ошибки. Обнаруженные проблемы перечислены на этой странице. Как обычно, если у вас появятся сложности с использованием пакета, мы хотели бы знать об этом. Оставляйте сообщения в разделе комментариев к этому посту.

Приятного await'инга!

Comments

  • Anonymous
    December 05, 2012
    Хорошая новость. Эх, вот если бы ещё можно было использовать async/await в VS2010 c .NET4.0.

  • Anonymous
    January 22, 2013
    Интересная новость, но не более.

  • Anonymous
    March 01, 2013
    А каким образом "foreach зависит IEnumerable"? Насколько мне известно, механика foreach обращается через рефлексию напрямую к методу GetEnumerator, что сделано во избежание упаковки для структур при преобразовании их в IEnumerable.

  • Anonymous
    March 27, 2013
    Скорее всего в плане реализации. Если тип не реализует интерфейс, то и метода не будет.