[Перевод] Асинхронность в C# 5.0
Архитекторы C# 2.0 понимали, что реализация перебора коллекций была сложной, поэтому они придумали итераторы, которые позволяли не задумываться о том, какой объект будет следующий.
Также они понимали, что написание небольших методов, которые используют локальные переменные, также неудобно. Поэтому они добавили анонимные методы, что позволило обойтись без написания дополнительного кода.
Архитекторы C# 3.0 понимали, что данные нужно сортировать, фильтровать, объединять и это было неудобным. Поэтому они придумали LINQ, expression trees и т.д.
Архитекторы C# 4.0 понимали, что взаимодействие с динамическими объектами вызывало сложности, поэтому они добавили динамический тип данных. Компилятор в рантайме определял тип данных с помощью созданного DLR (Dynamic Language Runtime).
Архитекторы C# 5.0 понимали, что написание асинхронных вызовов неудобно. Асинхронный код трудно тестировать, а преобразование в цепочку вызовов сложно.
Поэтому недавно было анонсировано, что C# 5.0 станет асинхронным.
Это значит, что, к примеру, этим куском кода:
void ArchiveDocuments(List urls) { for(int i = 0; i < urls.Count; ++i) Archive(Fetch(urls[i])); }
можно будет заменить этот:
async void ArchiveDocuments(List urls) { Task archive = null; for(int i = 0; i < urls.Count; ++i) { var document = await FetchAsync(urls[i]); if (archive != null) await archive; archive = ArchiveAsync(document); } }
Скажите, где в нашем примере лямбда-выражения и проверки завершилась ли текущая задача? Они все еще здесь. Просто мы позволим компилятору дописать все блоки с лямбда-выражениями, проверками, деревьями вызовов и т.д. По сути, async является синтаксическим "сахаром", но, согласитесь, вполне "сладким".
Нужно сразу уточнить, что логика обоих примеров будет одинаковая
В данный момент готовится Community Technology Preview прототип компилятора C# 5.0.Если вам не терпится уже поиграться с новыми возможностями, то вы можете посетить сайт msdn.com/vstudio/async, где сможете скачать Visual Studio Async CTP, а также ряд дополнительных материалов:
- Whitepaper: Asynchrony in .NET
- Walkthrough: Getting Started with Async
- Iterators in Visual Basic
- 101 Samples in C# and Visual Basic (еще не доступно)
Также вы можете посмотреть видео:
- Anders Hejlsberg: Introducing Async – Simplifying asynchronous programming
- Mads Torgersen: Inside C# Async
- Lucian Wischik: Inside VB.NET Async
- Stephen Toub: Task-Based Asynchrony with Async
- Meet the Async Design Team
И почитать в блогах:
- Async Blog Series by the Parallel Extensions Team
- Async Blog Series by Lucian Wischik
- S. Somasegar on Async
- Jason Zander on Async
- VB Team on Async
- C# Team on Async
Кроме того, стратегия комплексного развития C# и VB.NET сохраняется и Visual Basic 11 также будет поддерживать асинхронные задачи. Почитайте статью с блога разработчиков VB.NET, а также эту статью для получения дополнительной информации.
Что будет завтра? await? async? Task? как на счет AsyncThingy
* Даты анонсов в данный момент не известные, поэтому спрашивать об этом нет смысла.
P.S. Эту заметку Липперт писал, находясь на Microsoft PDC10.
Компании из статьи
Microsoft Украина | Украинское подразделение компании Microsoft. |