Net framework 5, а также среды Visual Studio 2012 и C#


асинхронная реализация сервера



Download 6,27 Mb.
Pdf ko'rish
bet604/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   600   601   602   603   604   605   606   607   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C

асинхронная реализация сервера
Многолетнее общение с множеством разработчиков показало, что лишь очень 
немногие из них знают о встроенных средствах .NET Framework, позволяющих 


814
Глава.28 .Асинхронные.операции.ввода-вывода
строить асинхронные серверы с хорошей масштабируемостью. В этой книге я не 
смогу объяснить, как эта задача решается для каждого вида серверов, но могу хотя 
бы указать, что следует искать в документации MSDN.
‰
Построение асинхронных приложений Web Forms ASP.NET
: добавьте в файле 
aspx
строку «Async=true» в директиве 
page
и ознакомьтесь с описанием метода 
RegisterAsyncTask
класса 
System.Web.UI.Page
.
‰
Построение асинхронных MVC-контроллеров ASP.NET
: объявите класс 
контроллера производным от 
System.Web.Mvc.AsyncController
и верните 
Task
из метода действия.
‰
Построение асинхронного обработчика ASP.NET
: объявите класс производным 
от 
System.Web.HttpTaskAsyncHandler
и переопределите его абстрактный метод 
ProcessRequestAsync
.
‰
Построение асинхронной службы WCF
: реализуйте службу как асинхронную 
функцию, возвращающую 
Task
или 
Task
.
Отмена операций ввода-вывода
В общем случае Windows не предоставляет возможности отмены затянувшейся опе-
рации ввода-вывода. Многие разработчики хотели бы видеть такую возможность, но 
реализовать ее достаточно сложно. Ведь если вы обращаетесь с запросом к серверу, 
а потом решаете, что ответ вам больше не нужен, просто приказать серверу проиг-
норировать исходный запрос уже не удастся; нужно принять байты на клиентской 
машине и отбросить их. Кроме того, возникает ситуация гонки — запрос на отмену 
может поступить в то время, когда сервер передает ответ. И как должно поступить 
ваше приложение? Вам придется обработать эту потенциальную ситуацию в своем 
коде и решить, то ли проигнорировать данные, то ли обработать их.
Для упрощения этой задачи я рекомендую реализовать метод расширения 
WithCancellation
, который расширяет 
Task
(вам также понадобится 
аналогичная перегрузка, расширяющая 
Task
) следующим образом:
private struct Void { } // Из-за отсутствия необобщенного класса
// TaskCompletionSource. 
private static async Task 
WithCancellation(this Task originalTask, 
CancellationToken ct) { 
// Создание объекта Task, завершаемого при отмене CancellationToken
var cancelTask = new TaskCompletionSource(); 
// При отмене CancellationToken завершить Task 
using (ct.Register( 


815
Отмена.операций.ввода-вывода
t => ((Tas
kCompletionSource)t).TrySetResult(new Void()), 
cancelTask)) { 
// Создание объекта Task, завершаемого при отмене исходного 
// объекта Task или объекта Task от CancellationToken
Task any = await Task.WhenAny(originalTask, cancelTask.Task); 
// Если какой-либо объект Task завершается из-за CancellationToken,
// инициировать OperationCanceledException 
if (any == cancelTask.Task) ct.ThrowIfCancellationRequested(); 

// Выполнить await для исходного задания (синхронно); awaiting it
// если произойдет ошибка, выдать первое внутреннее исключение
// вместо AggregateException 
return await originalTask; 
}
Теперь этот метод расширения вызывается следующим образом:
public static async Task Go() { 
// Создание объекта CancellationTokenSource, отменяющего себя
// через заданный промежуток времени в миллисекундах
var cts = new CancellationTokenSource(5000); // Чтобы отменить ранее, 
var ct = cts.Token; // вызовите cts.Cancel()
try { 
// Я использую Task.Delay для тестирования; замените другим методом,
// возвращающим Task 
await Task.Delay(10000).WithCancellation(ct); 
Console.WriteLine("Task completed"); 

catch (OperationCanceledException) { 
Console.WriteLine("Task cancelled"); 

}

Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   600   601   602   603   604   605   606   607   ...   658




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish