2013-05-08 3 views
1

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 раза для обработки этого запроса. Если я завершу его в асинхронном методе - будет ли он работать лучше?

Figure from MSDN mag article by Jeff Prosise

MSDN article

Это схема, поясняющая разницу между синхронизацией и обработки 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 раз)

+0

Ваша озабоченность верна, поскольку в документации ничего не говорится об этом. Я никогда не использовал его сам, поскольку в последнее время я не занимался веб-разработкой, но, поскольку экземпляр ** HttpContext ** передается, вы, вероятно, не работаете в рабочем потоке. Если да, то вы будете идти туда и обратно. Вы можете проверить текущий контекст синхронизации. Если это не null, вы находитесь в рабочем потоке. –

ответ

1

Он обрабатывает это просто отлично.

В IIS у вас есть «контекст запроса», предоставляемый вашему async, и ваши методы async по умолчанию будут возобновлены в этом контексте. Всякий раз, когда вы выполняете неполную задачу, поток возвращается в пул потоков (он не блокируется), и когда эта задача завершается, поток потоков потока используется для продолжения этого метода async после ввода этого контекста запроса.

Таким образом, нити не «удерживаются», но сам запрос. Помещение нескольких await s в другой метод async не будет иметь никакого значения, но было бы полезно запустить несколько Task с, а затем дождаться их завершения, например, await Task.WhenAll(task1, task2, task3); (при условии, что они все независимы, конечно).

Я не знаю, как правильно это проверить.

+0

Спасибо за ответ, но я обеспокоен тем, что этот код будет обрабатывать IIS-workthread 4 раза для обработки этого запроса.Если я завершу его в асинхронном методе - будет ли он работать лучше? –

+1

Я не уверен, что вы подразумеваете под «4 раза»; Не могли бы вы рассказать об этом по-другому? Обертка его в методе «асинхронный» не заставит его работать лучше. –

Смежные вопросы