C# 5.0. Взгляд в будущее

4,835 views
4,610 views

Published on

Рассказ Сергея Шебанина о планируемых асинхронных возможностях в C# 5.0

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,835
On SlideShare
0
From Embeds
0
Number of Embeds
84
Actions
Shares
0
Downloads
17
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

C# 5.0. Взгляд в будущее

  1. 1. C# 5.0 Взгляд в будущее Язык формирует наш способ мышления и определяет то, о чем мы можем мыслить. Б. Л. Ворф Специально для TulaDev.NET
  2. 2. О чем поговорим <ul><li>Я расскажу об одном интересном нововведении, которое планируется сделать в C# 5.0 </li></ul><ul><li>Объясню внутреннюю мотивацию разработчиков .NET </li></ul><ul><li>Рассмотрим примеры ситуаций, в которых полезны новые возможности </li></ul><ul><li>Разберем конкретный пример </li></ul>TulaDev.NET
  3. 3. История развития C# <ul><li>C# 1.0 Managed code </li></ul>TulaDev.NET
  4. 4. История развития C# <ul><li>C# 1.0 Managed code </li></ul><ul><li>C# 2.0 Iterators / Generics / Anonymous </li></ul>TulaDev.NET
  5. 5. История развития C# <ul><li>C# 1.0 Managed code </li></ul><ul><li>C# 2.0 Iterators / Generics / Anonymous </li></ul><ul><li>C# 3.0 LINQ / Lambda </li></ul>TulaDev.NET
  6. 6. История развития C# <ul><li>C# 1.0 Managed code </li></ul><ul><li>C# 2.0 Iterators / Generics / Anonymous </li></ul><ul><li>C# 3.0 LINQ / Lambda </li></ul><ul><li>C# 4.0 Dynamic / PLINQ </li></ul>TulaDev.NET
  7. 7. История развития C# <ul><li>C# 1.0 Managed code </li></ul><ul><li>C# 2.0 Iterators / Generics / Anonymous </li></ul><ul><li>C# 3.0 LINQ / Lambda </li></ul><ul><li>C# 4.0 Dynamic / PLINQ </li></ul><ul><li>C# 5.0 TAP (Task-based asynchronous pattern) </li></ul>TulaDev.NET
  8. 8. Зачем нужна асинхронность? <ul><li>var document = FetchDocument(url); ArchiveDocument(document); </li></ul><ul><li>FetchDocumentAsync(url, document => { ArchiveDocument(document); }); </li></ul>TulaDev.NET
  9. 9. Зачем нужна асинхронность? <ul><li>FetchDocumentAsync(url1, document => { ArchiveDocument(document); }); FetchDocumentAsync(url2, document => { ArchiveDocument(document); }); FetchDocumentAsync(url3, document => { ArchiveDocument(document); }); </li></ul><ul><li>Асинхронность позволяет рационально использовать ресурсы процессора в пределах одного потока </li></ul>TulaDev.NET
  10. 10. Асинхронность против многопоточности <ul><li>Асинхронность позволяет производить параллельную обработку в одном потоке </li></ul><ul><li>Следовательно асинхронный код не будет использовать все ядра вашего процессора </li></ul><ul><li>Но, так как поток один, то вы можете делать параллельную обработку без блокировок (lock) </li></ul>TulaDev.NET
  11. 11. Где нужна асинхронность? <ul><li>В первую очередь в обработке событий пользовательского интерфейса </li></ul><ul><li>SilverLight (JavaScript, например, — язык только с поддержкой асинхронности) </li></ul><ul><li>При программировании мультиплексоров и аналогичных им алгоритмов, использующих медленные внешние ресурсы: сеть, диски, другие накопители </li></ul>TulaDev.NET
  12. 12. Сопрограммы <ul><li>«Подпрограмма является частным случаем сопрограммы». Д. Кнут. </li></ul><ul><li>Пример программы, использующей 2 сопрограммы: var q := new queue coroutine produce loop while q is not full create some new items add the items to q yield to consume coroutine consume loop while q is not empty remove some items from q use the items yield to produce </li></ul>При первом вызове сопрограммы, выполнение начинается со стартовой точки сопрограммы. Однако при последующих вызовах выполнение продолжается с точки последнего возврата. TulaDev.NET
  13. 13. Как это выглядит в 5.0? <ul><li>Возьмем код var document = FetchDocument(url ) ; ArchiveDocument(document); </li></ul><ul><li>Его можно преобразовать в асинхронный вариант Task<document> task = FetchDocumentAsync(url); task.ContinueWith(document => { ArchiveDocument(document); }); </li></ul><ul><li>В C# 5.0 мы можем использовать другой синтаксис ArchiveDocument( await FetchDocumentAsync(url)); </li></ul>TulaDev.NET
  14. 14. Как это выглядит в 5.0? <ul><li>Первая магия C# 5.0 - await task Означает конструкция буквально следующее: </li></ul><ul><ul><li>Если таск, для которого выполняется await еще не завершен, то установить остаток текущего метода как продолжение ( continuation) таска </li></ul></ul><ul><ul><li>Затем вернуть управление вызывающему методу </li></ul></ul><ul><ul><li>Продолжение метода будет вызвано таском, когда он будет завершен </li></ul></ul>TulaDev.NET
  15. 15. Как это выглядит в 5.0? <ul><li>Вторая магия C# 5.0 – модификатор метода async Означает буквально следующее: </li></ul><ul><ul><li>Этот метод содержит конструкции await , так что компилятор должен преобразовать его таким образом, чтобы асинхронные операции могли продолжить выполнение этого метода </li></ul></ul><ul><ul><li>Метод может быть продолжен не с произвольной точки, а только с тех точек, которые запоминают конструкции await </li></ul></ul>TulaDev.NET
  16. 16. Как это выглядит в 5.0? <ul><li>Конструкция await может быть указана только внутри async метода </li></ul><ul><li>Методы async могут возвращать только void , Task или Task<T> </li></ul><ul><li>При этом void и Task методы не могут возвращать ничего внутри своей реализации. То есть содержать только return ; </li></ul><ul><li>Task<T> методы могут внутри содержать только конструкцию return <something of type T>; </li></ul>TulaDev.NET
  17. 17. Синхронный пример Document FetchDocument( string url) { HttpRequest request = (HttpRequest) WebRequest.Create(url); var response = request.GetResponse(); var stream = response.GetResponseStream(); const int BUFFER_SIZE = 512; int count = 0; var bytes = new List< byte >(); var bytes = new buffer[BUFFER_SIZE]; do { count = stream.Read(buffer, 0, BUFFER_SIZE); bytes.AddRange(buffer, 0, count); } while (count > 0); return new Document(bytes); } void SomeButton_Click() { var document = FetchDocument(url); ArchiveDocument(document); } TulaDev.NET Thread
  18. 18. Асинхронный пример async Task<Document> FetchDocument( string url) { HttpRequest request = (HttpRequest) WebRequest.Create(url); var response = await request.GetResponseAsync(); var stream = response.GetResponseStream(); const int BUFFER_SIZE = 512; int count = 0; var bytes = new List< byte >(); var bytes = new buffer[BUFFER_SIZE]; do { count = await stream.ReadAsync(buffer, 0, BUFFER_SIZE); bytes.AddRange(buffer, 0, count); } while (count > 0); return new Document(bytes); } async void SomeButton_Click() { var document = await FetchDocument(url); ArchiveDocument(document); } TulaDev.NET Thread
  19. 19. Лучше один раз увидеть... Давайте рассмотрим пример в VisualStudio TulaDev.NET
  20. 20. Что еще нужно знать? <ul><li>Конструкция await применима не только для Task . Но и для любого выражения, для которого определен метод GetAwaiter() , возвращающий тип, для которого можно вызвать методы BeginAwait(Action) и EndAwait() </li></ul><ul><li>Асинхронный синтаксис сохраняет интуитивно понятный способ обработки исключений для вашего кода </li></ul><ul><li>Предварительная версия компилятора C# 5.0 пока еще совсем предварительная. То есть в ней может поменяться все, вплоть до синтаксиса </li></ul>TulaDev.NET
  21. 21. Источник информации <ul><li>http://msdn.com/vstudio/async </li></ul><ul><li>Здесь можно скачать предварительную версию Async CTP (Community Technology Preview) </li></ul><ul><li>Есть ссылки на документацию, примеры и обсуждения в блогах </li></ul><ul><li>Много видео с выступлениями дизайнеров C# 5.0 </li></ul><ul><li>http://nsentinel.blogspot.com/ </li></ul><ul><li>Можно подробно прочитать о TAP в C# 5.0 по-русски </li></ul>TulaDev.NET
  22. 22. Контактная информация [email_address] ICQ: 198779172 http://www.tuladev.net/ TulaDev.NET

×