HttpTaskAsyncHandler 是一个很好的基类,用于在 ASP.NET 4.5 中制作异步 http 处理程序 我想知道运行时如何处理 ProcessRequestAsync 中的多个等待语句。
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 个 await 包装在 async 方法中会更好吗?
编辑: 我担心这段代码需要 IIS-workerthread 4 次来处理这个请求。如果我将它包装在一个异步方法中 - 它会表现得更好吗?
这是解释 ASP.NET 中同步和异步页面处理之间差异的图表。恐怕我的示例会导致从主工作线程(图中的粉红色框)启动 3 个线程,从而增加开销。
IIS -> task1 TP -> IIS -> task2 TP -> IIS -> task3 TP -> IIS
(任务切换到主IIS WT 4次)
或者编译器是否非常聪明,它只是将延续从一个任务传递到下一个任务,并在 3 个任务完成后返回主线程。
IIS -> 任务1 TP -> 任务2 TP -> 任务3 TP -> IIS
(任务切换到主IIS WT 1次)