C# 5
C# е активно развиващ се език, във всяка версия на който има интересни функции, които наистина улесняват писането на висококачествен и разбираем код. Например Linq направи много по-лесно писането на филтри за колекции и sql заявки в код. Сега е време за асинхронност.
И въпреки че рамката вече е натрупала доста голям брой начини за писане на многонишков код, от ръчно създаване на нишка до визуалния BackgroundWorker компонент, разработването на асинхронно приложение изисква писане на прилично количество инфраструктурен код, което се увеличава, когато задачата става по-сложна. Основният проблем с това според мен е необходимостта да се промени състоянието на потребителския интерфейс от фонова нишка (което, както знаете, не може да се направи директно).
Новата езикова конструкция async/await решава този проблем, като позволява не само да се изпълни задача във фонова нишка и да се изпълни кодът в основната, когато тя завърши, но и го прави визуално - кодът изглежда почти като синхронен (включително обработка на изключения).
Запознайте се: async/await
Най-общо казано, ключовите думи не отразяват ясно същността, но както обясняват разработчиците, никой не е измислил по-добър, така че те са това, което са. Както повечето неща в програмирането, новата конструкция е най-лесна за разбиране директно от кода:
И така, методътDownloadStringTaskAsync създава задача и незабавно я връща от функцията, докато фоновата нишка започва да изтегля страницата от искания url. Ние сме свободни да работим директно с обекта Task ръчно, докато чакаме резултатът да се изпълни:
Този код, разбира се, остава синхронен, тъй като чакаме фоновата нишка да се изпълни в основната нишка ...
Трябваначин за удобна и асинхронна работа със задачата (Task), която остава единствената „нишка“, която ни свързва с фоновата нишка. И тук на сцената се появява await - той не само разширява задачата в T, но също така задава останалата част от метода на „продължение“ (продължение), което ще бъде изпълнено след завършване на задачата и най-важното в същата нишка. Това ще излезе от функцията OnButtonClick() и приложението ще продължи да работи в нормален режим, отговаряйки на действията на потребителя.
Веднага след като фоновата нишка завърши работата си и върне резултата, ще бъде извършено „продължение“ вглавната нишка, която в този случай ще настрои съдържанието на страницата към текстовото поле.
Остава да се справим с ключовата дума async - те трябва да маркират онези функции, в които ще се използва await. Всичко е просто и най-важното е, че компилаторът ще се грижи за вас, за да не го забравите - без да ви позволява да компилирате програмата.
Как изглежда в действие
Една функция може да има множество чакания, което ви позволява да създавате асинхронни вериги на изпълнение:
Ами изключенията? Тъй като разработчиците обещаха, че новият синтаксис ще бъде прост и близък до синхронния, те не можеха да пренебрегнат толкова важен въпрос за обработката на изключения. Както беше обещано, изключенията, хвърлени във фонова нишка, могат да се обработват с помощта на класическия синтаксис (като че ли няма асинхронност):
При обработката на изключения обаче има един момент, който трябва да разберете - тъй като целият код, който идва след await, е настроен на завършване и когато е напълно неизвестен, такава обработка на изключения няма да работи:
Функцията за изтегляне ще се върне веднага щом бъде създадена задачата с фоновата нишка и след това функцията ще излезе.StartButtonClick... и по-късно фонова нишка ще хвърли изключение, че името на домейна не може да бъде разрешено. По-подробно обяснение можете да прочетете тук.
В предстоящия .Net 4.5 ще бъдат добавени много класове, които да поддържат новия синтаксис – т.е. ще има много функции, връщащи Task и Task. И съдейки по простотата на новия синтаксис, той ще стане широко разпространен, така че е необходимо ясно разбиране на новите езикови конструкции, техните действия и обхват.
За да обобщим, ключовата дума async не кара метода да бъде изпълнен на фонова нишка (както подсказва името), а само маркира, че има чакане вътре в метода, който работи с Task и Task по такъв начин, че остатъкът от метода след await ще бъде изпълнен след завършване на Задачата, но в основната нишка.
Представяйки новия синтаксис, Microsoft предлага не само синтактична захар, но цял модел на асинхронно програмиране, включително обработка на изключения, метод за прекъсване на асинхронна функция и отчитане на напредъка ... които вече са извън обхвата на тази статия.
Hardcore conf в C++. Каним само професионалисти.