HttpTaskAsyncHandler是一个很好的基类,用于在ASP.NET 4.5中创建异步http处理程序 我想知道运行时如何在ProcessRequestAsync中处理多个await语句。
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次吗? 我最终如何测试/看到这个? 用asyn方法包装3等待更好吗?
修改 我担心这段代码会使用IIS-workerthread 4次来处理这个请求。 如果我用异步方法将其包装起来 - 它会更好地表现吗?
这是一个解释ASP.NET中同步和异步页面处理之间差异的图表。我担心我的例子会导致从主工作线程(图中的粉色框)启动3个线程,从而增加了开销。
IIS - > task1 TP - > IIS - > task2 TP - > IIS - > task3 TP - > IIS
(任务切换到主IIS WT 4次)
或者编译器如此智能,它只是将一个任务的继续传递给下一个任务,并在完成3个任务后返回主线程。
IIS - > task1 TP - > task2 TP - > task3 TP - > IIS
(任务切换到主IIS WT 1次)
答案 0 :(得分:1)
它处理得很好。
在IIS中,您向async
处理程序提供了“请求上下文”,默认情况下,您的async
方法将在该上下文中恢复。每当你await
一个不完整的任务时,线程就会被返回到线程池(它没有被阻塞),当该任务完成时,线程池线程用于在输入之后继续async
方法。请求上下文。
因此,没有线程被“保留”,但请求本身就是。将多个await
放在另一个async
方法中不会产生任何影响,但是启动多个Task
然后等待它们全部完成会有所不同,例如{ {1}}(假设他们当然都是独立的)。
我不知道验证此行为的好方法。