C# 5.0 Взгляд в будущее Язык формирует наш способ мышления и определяет то, о чем мы можем мыслить. Б. Л. Ворф Специально для TulaDev.NET. - пр

Содержание

Слайд 2

О чем поговорим

Я расскажу об одном интересном нововведении, которое планируется сделать в

О чем поговорим Я расскажу об одном интересном нововведении, которое планируется сделать
C# 5.0
Объясню внутреннюю мотивацию разработчиков .NET
Рассмотрим примеры ситуаций, в которых полезны новые возможности
Разберем конкретный пример

TulaDev.NET

Слайд 3

История развития C#

C# 1.0 Managed code

TulaDev.NET

История развития C# C# 1.0 Managed code TulaDev.NET

Слайд 4

История развития C#

C# 1.0 Managed code
C# 2.0 Iterators / Generics / Anonymous

TulaDev.NET

История развития C# C# 1.0 Managed code C# 2.0 Iterators / Generics / Anonymous TulaDev.NET

Слайд 5

История развития C#

C# 1.0 Managed code
C# 2.0 Iterators / Generics / Anonymous
C#

История развития C# C# 1.0 Managed code C# 2.0 Iterators / Generics
3.0 LINQ / Lambda

TulaDev.NET

Слайд 6

История развития C#

C# 1.0 Managed code
C# 2.0 Iterators / Generics / Anonymous
C#

История развития C# C# 1.0 Managed code C# 2.0 Iterators / Generics
3.0 LINQ / Lambda
C# 4.0 Dynamic / PLINQ

TulaDev.NET

Слайд 7

История развития C#

C# 1.0 Managed code
C# 2.0 Iterators / Generics / Anonymous
C#

История развития C# C# 1.0 Managed code C# 2.0 Iterators / Generics
3.0 LINQ / Lambda
C# 4.0 Dynamic / PLINQ
C# 5.0 TAP (Task-based asynchronous pattern)

TulaDev.NET

Слайд 8

Зачем нужна асинхронность?

var document = FetchDocument(url); ArchiveDocument(document);
FetchDocumentAsync(url, document => { ArchiveDocument(document); });

TulaDev.NET

Зачем нужна асинхронность? var document = FetchDocument(url); ArchiveDocument(document); FetchDocumentAsync(url, document => { ArchiveDocument(document); }); TulaDev.NET

Слайд 9

Зачем нужна асинхронность?

FetchDocumentAsync(url1, document => { ArchiveDocument(document); }); FetchDocumentAsync(url2, document => { ArchiveDocument(document); }); FetchDocumentAsync(url3, document => { ArchiveDocument(document); });
Асинхронность

Зачем нужна асинхронность? FetchDocumentAsync(url1, document => { ArchiveDocument(document); }); FetchDocumentAsync(url2, document =>
позволяет рационально использовать ресурсы процессора в пределах одного потока

TulaDev.NET

Слайд 10

Асинхронность против многопоточности

Асинхронность позволяет производить параллельную обработку в одном потоке
Следовательно асинхронный код

Асинхронность против многопоточности Асинхронность позволяет производить параллельную обработку в одном потоке Следовательно
не будет использовать все ядра вашего процессора
Но, так как поток один, то вы можете делать параллельную обработку без блокировок (lock)

TulaDev.NET

Слайд 11

Где нужна асинхронность?

В первую очередь в обработке событий пользовательского интерфейса
SilverLight (JavaScript, например,

Где нужна асинхронность? В первую очередь в обработке событий пользовательского интерфейса SilverLight
— язык только с поддержкой асинхронности)
При программировании мультиплексоров и аналогичных им алгоритмов, использующих медленные внешние ресурсы: сеть, диски, другие накопители

TulaDev.NET

Слайд 12

Сопрограммы

«Подпрограмма является частным случаем сопрограммы». Д. Кнут.
Пример программы, использующей 2 сопрограммы: var q

Сопрограммы «Подпрограмма является частным случаем сопрограммы». Д. Кнут. Пример программы, использующей 2
:= 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

При первом вызове сопрограммы, выполнение начинается со стартовой точки сопрограммы.
Однако при последующих вызовах выполнение продолжается с точки последнего возврата.

TulaDev.NET

Слайд 13

Как это выглядит в 5.0?

Возьмем код var document = FetchDocument(url); ArchiveDocument(document);
Его можно преобразовать в

Как это выглядит в 5.0? Возьмем код var document = FetchDocument(url); ArchiveDocument(document);
асинхронный вариант Task task = FetchDocumentAsync(url); task.ContinueWith(document => { ArchiveDocument(document); });
В C# 5.0 мы можем использовать другой синтаксис ArchiveDocument(await FetchDocumentAsync(url));

TulaDev.NET

Слайд 14

Как это выглядит в 5.0?

Первая магия C# 5.0 - await task Означает конструкция

Как это выглядит в 5.0? Первая магия C# 5.0 - await task
буквально следующее:
Если таск, для которого выполняется await еще не завершен, то установить остаток текущего метода как продолжение (continuation) таска
Затем вернуть управление вызывающему методу
Продолжение метода будет вызвано таском, когда он будет завершен

TulaDev.NET

Слайд 15

Как это выглядит в 5.0?

Вторая магия C# 5.0 – модификатор метода async Означает

Как это выглядит в 5.0? Вторая магия C# 5.0 – модификатор метода
буквально следующее:
Этот метод содержит конструкции await, так что компилятор должен преобразовать его таким образом, чтобы асинхронные операции могли продолжить выполнение этого метода
Метод может быть продолжен не с произвольной точки, а только с тех точек, которые запоминают конструкции await

TulaDev.NET

Слайд 16

Как это выглядит в 5.0?

Конструкция await может быть указана только внутри async

Как это выглядит в 5.0? Конструкция await может быть указана только внутри
метода
Методы async могут возвращать только void, Task или Task
При этом void и Task методы не могут возвращать ничего внутри своей реализации. То есть содержать только return;
Task методы могут внутри содержать только конструкцию return ;

TulaDev.NET

Слайд 17

Синхронный пример

Document FetchDocument(string url) {
HttpRequest request = (HttpRequest) WebRequest.Create(url);
var response

Синхронный пример Document FetchDocument(string url) { HttpRequest request = (HttpRequest) WebRequest.Create(url); var
= request.GetResponse();
var stream = response.GetResponseStream();
const int BUFFER_SIZE = 512;
int count = 0;
var bytes = new List();
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

Асинхронный пример

async Task FetchDocument(string url) {
HttpRequest request = (HttpRequest) WebRequest.Create(url);
var

Асинхронный пример async Task FetchDocument(string url) { HttpRequest request = (HttpRequest) WebRequest.Create(url);
response = await request.GetResponseAsync();
var stream = response.GetResponseStream();
const int BUFFER_SIZE = 512;
int count = 0;
var bytes = new List();
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

Лучше один раз увидеть...

Давайте рассмотрим пример в VisualStudio

TulaDev.NET

Лучше один раз увидеть... Давайте рассмотрим пример в VisualStudio TulaDev.NET

Слайд 20

Что еще нужно знать?

Конструкция await применима не только для Task. Но и

Что еще нужно знать? Конструкция await применима не только для Task. Но
для любого выражения, для которого определен метод GetAwaiter(), возвращающий тип, для которого можно вызвать методы BeginAwait(Action) и EndAwait()
Асинхронный синтаксис сохраняет интуитивно понятный способ обработки исключений для вашего кода
Предварительная версия компилятора C# 5.0 пока еще совсем предварительная. То есть в ней может поменяться все, вплоть до синтаксиса

TulaDev.NET

Слайд 21

Источник информации

http://msdn.com/vstudio/async
Здесь можно скачать предварительную версию Async CTP (Community Technology Preview)
Есть ссылки

Источник информации http://msdn.com/vstudio/async Здесь можно скачать предварительную версию Async CTP (Community Technology
на документацию, примеры и обсуждения в блогах
Много видео с выступлениями дизайнеров C# 5.0
http://nsentinel.blogspot.com/
Можно подробно прочитать о TAP в C# 5.0 по-русски

TulaDev.NET

Имя файла: C#-5.0-Взгляд-в-будущее-Язык-формирует-наш-способ-мышления-и-определяет-то,-о-чем-мы-можем-мыслить.-Б.-Л.-Ворф-Специально-для-TulaDev.NET.---пр.pptx
Количество просмотров: 229
Количество скачиваний: 2