c# 5.0. Взгляд в будущее
DESCRIPTION
Рассказ Сергея Шебанина о планируемых асинхронных возможностях в C# 5.0TRANSCRIPT
![Page 1: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/1.jpg)
C# 5.0Взгляд в будущее
Язык формирует наш способ мышления и определяет то, о чем мы можем мыслить.
Б. Л. Ворф
Специально для TulaDev.NET
![Page 2: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/2.jpg)
О чем поговорим
• Я расскажу об одном интересном нововведении, которое планируется сделать в C# 5.0
• Объясню внутреннюю мотивацию разработчиков .NET
• Рассмотрим примеры ситуаций, в которых полезны новые возможности
• Разберем конкретный примерTulaDev.NET
![Page 3: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/3.jpg)
История развития C#
• C# 1.0 Managed code
TulaDev.NET
![Page 4: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/4.jpg)
История развития C#
• C# 1.0 Managed code
• C# 2.0 Iterators / Generics / Anonymous
TulaDev.NET
![Page 5: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/5.jpg)
История развития C#
• C# 1.0 Managed code
• C# 2.0 Iterators / Generics / Anonymous
• C# 3.0 LINQ / Lambda
TulaDev.NET
![Page 6: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/6.jpg)
История развития C#
• C# 1.0 Managed code
• C# 2.0 Iterators / Generics / Anonymous
• C# 3.0 LINQ / Lambda
• C# 4.0 Dynamic / PLINQ
TulaDev.NET
![Page 7: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/7.jpg)
История развития C#
• C# 1.0 Managed code
• C# 2.0 Iterators / Generics / Anonymous
• C# 3.0 LINQ / Lambda
• C# 4.0 Dynamic / PLINQ
• C# 5.0 TAP (Task-based asynchronous pattern)
TulaDev.NET
![Page 8: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/8.jpg)
Зачем нужна асинхронность?
• var document = FetchDocument(url);ArchiveDocument(document);
• FetchDocumentAsync(url, document => {ArchiveDocument(document);
});
TulaDev.NET
![Page 9: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/9.jpg)
Зачем нужна асинхронность?
• FetchDocumentAsync(url1, document => {ArchiveDocument(document);
});FetchDocumentAsync(url2, document => {
ArchiveDocument(document);});FetchDocumentAsync(url3, document => {
ArchiveDocument(document);});
• Асинхронность позволяет рационально использовать ресурсы процессора в пределах одного потока
TulaDev.NET
![Page 10: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/10.jpg)
Асинхронность против многопоточности
• Асинхронность позволяет производить параллельную обработку в одном потоке
• Следовательно асинхронный код не будет использовать все ядра вашего процессора
• Но, так как поток один, то вы можете делать параллельную обработку без блокировок (lock)
TulaDev.NET
![Page 11: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/11.jpg)
Где нужна асинхронность?
• В первую очередь в обработке событий пользовательского интерфейса
• SilverLight (JavaScript, например, — язык только с поддержкой асинхронности)
• При программировании мультиплексоров и аналогичных им алгоритмов, использующих медленные внешние ресурсы: сеть, диски, другие накопители
TulaDev.NET
![Page 12: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/12.jpg)
Сопрограммы
• «Подпрограмма является частным случаем сопрограммы». Д. Кнут.• Пример программы, использующей 2 сопрограммы:
var q := new queuecoroutine produce
loop while q is not fullcreate some new itemsadd the items to q
yield to consumecoroutine consume
loop while q is not emptyremove some items from quse the items
yield to produce
При первом вызове сопрограммы, выполнение начинается со стартовой точки сопрограммы.
Однако при последующих вызовах выполнение продолжается с точки последнего возврата.
TulaDev.NET
![Page 13: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/13.jpg)
Как это выглядит в 5.0?
• Возьмем кодvar document = FetchDocument(url);ArchiveDocument(document);
• Его можно преобразовать в асинхронный вариантTask<document> task = FetchDocumentAsync(url);task.ContinueWith(document => {
ArchiveDocument(document);});
• В C# 5.0 мы можем использовать другой синтаксисArchiveDocument(await FetchDocumentAsync(url));
TulaDev.NET
![Page 14: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/14.jpg)
Как это выглядит в 5.0?
• Первая магия C# 5.0 - await taskОзначает конструкция буквально следующее:
• Если таск, для которого выполняется await еще не завершен, то установить остаток текущего метода как продолжение (continuation) таска
• Затем вернуть управление вызывающему методу
• Продолжение метода будет вызвано таском, когда он будет завершен
TulaDev.NET
![Page 15: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/15.jpg)
Как это выглядит в 5.0?
• Вторая магия C# 5.0 – модификатор метода asyncОзначает буквально следующее:
• Этот метод содержит конструкции await, так что компилятор должен преобразовать его таким образом, чтобы асинхронные операции могли продолжить выполнение этого метода
• Метод может быть продолжен не с произвольной точки, а только с тех точек, которые запоминают конструкции await
TulaDev.NET
![Page 16: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/16.jpg)
Как это выглядит в 5.0?
• Конструкция await может быть указана только внутри async метода
• Методы async могут возвращать только void, Task или Task<T>
• При этом void и Task методы не могут возвращать ничего внутри своей реализации. То есть содержать только return;
• Task<T> методы могут внутри содержать только конструкцию return <something of type T>;
TulaDev.NET
![Page 17: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/17.jpg)
Синхронный пример
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
![Page 18: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/18.jpg)
Асинхронный пример
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
![Page 19: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/19.jpg)
Лучше один раз увидеть...
Давайте рассмотрим пример в VisualStudio
TulaDev.NET
![Page 20: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/20.jpg)
Что еще нужно знать?
• Конструкция await применима не только для Task. Но и для любого выражения, для которого определен метод GetAwaiter(), возвращающий тип, для которого можно вызвать методы BeginAwait(Action) и EndAwait()
• Асинхронный синтаксис сохраняет интуитивно понятный способ обработки исключений для вашего кода
• Предварительная версия компилятора C# 5.0 пока еще совсем предварительная. То есть в ней может поменяться все, вплоть до синтаксиса
TulaDev.NET
![Page 21: C# 5.0. Взгляд в будущее](https://reader038.vdocuments.site/reader038/viewer/2022103114/555e1c6cd8b42a6a4c8b4663/html5/thumbnails/21.jpg)
Источник информации
http://msdn.com/vstudio/async―Здесь можно скачать предварительную версию Async CTP (Community Technology Preview)―Есть ссылки на документацию, примеры и обсуждения в блогах―Много видео с выступлениями дизайнеров C# 5.0http://nsentinel.blogspot.com/―Можно подробно прочитать о TAP в C# 5.0 по-русски
TulaDev.NET