【发布时间】:2023-04-03 12:55:01
【问题描述】:
考虑一个耗时的同步方法“Foo”:
public int Foo(int id)
{
// Do some expensive calculation
return 42;
}
还有一个托管在 IIS 中的称为“FooService”的 WCF 服务,它调用“Foo”:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class FooService
{
public Task<int> GetFoo(int id)
{
return Task.Factory.StartNew(() => return Foo(id));
}
public int GetFoo2(int id)
{
return Foo(id);
}
}
如果我为 Foo 启动并返回任务,我会获得任何好处吗?像 - 我是否减少了 I/O 线程的负载?
【问题讨论】:
-
您不应该使用
Task.Factory.StartNew或Task.Run在ASP.NET中包装一个同步的、受CPU 限制的工作方法。所有这些只是增加了线程切换的开销。调用Task.Factory.StartNew并将其作为Task返回的HTTP 请求至少需要相同数量的线程才能完成,您不会提高可伸缩性,只会降低性能。 OTOH,这对于自然 IO 绑定的任务确实有意义,这些任务在挂起时不使用线程。
标签: c# wcf iis task-parallel-library task