HttpTaskAsyncHandler - хороший базовый класс для создания асинхронных HTTP-обработчиков в ASP.NET. 4.5 Интересно, как среда выполнения обрабатывает более одного ожидания в ProcessRequestAsync.В HttpTaskAsyncHandler более одного ждут
public class CallbackHandler : HttpTaskAsyncHandler
{
public override async Task ProcessRequestAsync(HttpContext context)
{
int value1 = await Task.Factory.StartNew(() => 1);
int value2 = await Task.Factory.StartNew(() => 2);
int value3 = await Task.Factory.StartNew(() => 3);
context.Response.Write(value1 + value2 + value3);
}
public override bool IsReusable
{
get { return true; }
}
}
Является ли нить IIS переносятся на удержание 3 раза? Как мне в конечном итоге проверить/увидеть это? Лучше ли обернуть 3 ожидания в методе asyn?
Редактировать: Я обеспокоен тем, что этот код будет обрабатывать IIS-workthread 4 раза для обработки этого запроса. Если я завершу его в асинхронном методе - будет ли он работать лучше?
Это схема, поясняющая разницу между синхронизацией и обработки ASYN страницы в ASP.NET. Я боюсь, что мой пример приведет к тому, что 3 потока будут запущены из основного рабочего потока (розовые коробки на диаграмме) и, таким образом, добавят накладные расходы.
IIS -> task1 ТР -> IIS -> task2 ТР -> IIS -> Task3 ТР -> IIS
(Задание переключения на основной WT IIS 4 раза)
Или компилятор так умный, что он просто передает продолжение от одной задачи к другой и возвращается в основной поток после выполнения 3 задач.
IIS -> task1 TP -> task2 TP -> Task3 TP -> IIS
(Задача перехода на основной WT IIS 1 раз)
Ваша озабоченность верна, поскольку в документации ничего не говорится об этом. Я никогда не использовал его сам, поскольку в последнее время я не занимался веб-разработкой, но, поскольку экземпляр ** HttpContext ** передается, вы, вероятно, не работаете в рабочем потоке. Если да, то вы будете идти туда и обратно. Вы можете проверить текущий контекст синхронизации. Если это не null, вы находитесь в рабочем потоке. –