Глава.28 .Асинхронные.операции.ввода-вывода
проводить в пуле в режиме ожидания. А значит, в начале уборки мусора потоки
окажутся наверху стека, и поиск корней не займет много времени.
При достижении отлаживаемым приложением точки останова Windows при-
останавливает все его потоки. После возвращения к отладке следует возобновить
все потоки, а значит, при наличии большого количества потоков пошаговая отладка
будет выполняться крайне медленно. Асинхронный ввод-вывод позволяет обойтись
всего несколькими потоками, повышая тем самым производительность отладки.
Выгоды этим не исчерпываются. Предположим, ваше приложение должно за-
грузить с различных сайтов 10 изображений. Загрузка каждого из них занимает
5 секунд. В синхронном режиме выполнения (загрузка одного изображения за
другим) вам потребуется 50 секунд. Однако при помощи всего одного потока можно
начать 10 асинхронных операций загрузки и получить все изображения всего за
5 секунд! То есть время выполнения нескольких синхронных операций ввода-вывода
получается путем суммирования времени, которое занимает каждая отдельная опе-
рация, в то время как в случае набора асинхронных операций ввода-вывода время
их завершения определяется самой медленной из выполняемых операций.
Для приложений с графическим интерфейсом асинхронные операции открыва-
ют еще одно преимущество: их интерфейс всегда реагирует на действия конечного
пользователя. В приложениях Silverlight и Windows Store вообще все операции
ввода-вывода выполняются только асинхронно, потому что библиотеки классов
операций ввода-вывода предоставляют только асинхронные версии своих операций;
методы выполнения синхронных операций просто отсутствуют. Это было сделано
намеренно, чтобы приложение не переставало реагировать на действия конечного
пользователя.
асинхронные функции C#
Асинхронные операции являются ключом к созданию высокопроизводительных
масштабируемых приложений, выполняющих множество операций при помощи
небольшого количества потоков. Вместе с пулом потоков они дают возможность
эффективно задействовать все процессоры в системе. Осознавая этот огромный
потенциал, разработчики CLR разработали модель программирования, призванную
сделать его доступным для всех программистов
1
. Эта модель использует объекты
1
Разработчики, использующие версии Microsoft .NET Framework до 4.5, могут восполь-
зоваться моим классом AsyncEnumerator (из библиотеки Power Threading — см. http://
Wintellect.com/) — его модель программирования достаточно похожа на модель .NET
Framework 4.5. Собственно, успех класса AsnycEnumerator позволил мне помочь Microsoft
в проектировании модели, рассматриваемой в этой главе. Ввиду их сходства адаптация
кода, использующего класс AsyncEnumerator, для новой программной модели проходит
тривиально.
793
Асинхронные.функции.C#
Task
(см. главу 27) и
асинхронные функции
языка C#. В следующем примере кода
асинхронные функции используются для выполнения двух асинхронных операций.
private static async Task IssueClientRequestAsync(String serverName,
String message)
{
using (var pipe = new NamedPipeClientStream(serverName, "PipeName",
PipeDirection.InOut, PipeOptions.Asynchronous | PipeOptions.WriteThrough))
{
pipe.Connect(); // Прежде чем задавать ReadMode, необходимо
pipe.ReadMode = PipeTransmissionMode.Message; // вызвать Connect
// Асинхронная отправка данных серверу
Byte[] request = Encoding.UTF8.GetBytes(message);
await pipe.WriteAsync(request, 0, request.Length);
// Асинхронное чтение ответа сервера
Byte[] response = new Byte[1000];
Int32 bytesRead = await pipe.ReadAsync(response, 0, response.Length);
return Encoding.UTF8.GetString(response, 0, bytesRead);
} // Закрытие канала
}
В приведенном коде сразу видно, что
IssueClientRequestAsync
является асин-
хронной функцией, потому что ключевое слово
async
следует в первой строке сразу
же после
static
. Когда метод помечается ключевым словом
async
, компилятор
преобразует код метода в тип, реализующий конечный автомат (более подробное
описание приводится в следующем разделе). Это позволяет потоку выполнить
Do'stlaringiz bilan baham: |