我有一个IHttpHandler,它执行三个方法:
方法A和方法B的计算是完全独立的。方法C使用方法A和B的结果。当前,这些方法是顺序执行的。为了获得IHttpHandler的更好的整体性能,我的想法是并行计算方法A和B。如果A和B已完成,则应启动方法C。这有可能吗?
此致Thorsten
最佳答案
当然可以。不过,真正的乐趣是弄清楚它是否明智。如果工作是CPU密集型的,那么对于少量请求,它会扩展(例如,在只有您的本地计算机上看起来很好)-但是,如果有很多其他并行请求,那么您可能实际上会降低性能(线程有开销,并且内核有限)。
如果您的请求数量少(即您有足够的内核来并行处理负载而不用尽),或者工作主要是IO绑定(bind),则应该可以。
只需为以下项目之一启动任务:
var task = new Task<ResultType>(() => Method_B());
task.Start();
var a = Method_A();
var b = task.Result;
Method_C(a, b);
请注意,这确实引入了许多相关问题-例如,
Method_B()
中的代码将无法直接访问任何与请求相关的上下文。理想情况下,首先(在主要的HTTP请求线程上)收集Method_B()
需要的所有信息,然后通过与http上下文无关的简单数据类型将其传递。同样,使用线程局部数据的任何内容(例如TransactionScope
)都不会自动流入Method_B()
。关于c# - IHttpHandler : Speeding up performance with parallelism?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7872292/