考虑一个耗时的同步方法“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 线程的负载?
最佳答案
WCF 中的任务提供了比 APM 模式 (BeginXX/EndXX) 更方便的 API。为什么要在 WCF 中使用异步调用?因为,如果操作得当,它会带来更好的线程利用率,进而让您的应用程序更具可扩展性。
在客户端,拥有基于任务的服务契约,可以更轻松地调用服务,而无需阻塞线程,等待调用返回。即使该操作是服务器端的同步、CPU 密集型操作,客户端也会从任务中受益。此外,对于任务,通过调用 Task.Wait()
再次使调用同步非常简单。或 Task<T>.Result
.
在服务端,基于任务的操作在多种情况下很有用:
- 您想并行处理一些受 CPU 限制的操作
- 您正在执行 IO(例如调用其他服务、读取文件等)
- 以上任意组合
每次调用 WCF 操作时,WCF 都会从线程池中获取一个线程来处理请求。所以没必要打电话StartNew
,它将操作排队到线程池(完全多余的开销):
public Task<int> GetFoo(int id)
{
return Task.Factory.StartNew(() => return Foo(id));
}
相反,您可以使用 FromResult
,它创建一个完成的任务对象:
public Task<int> GetFoo(int id)
{
return Task.FromResult(new Foo(id));
}
最后,如果上述用例都不相关,并且您的客户端 API 需要同步,那么使用任务就没有意义。
关于c# - 在 WCF 或 WebAPI 方法 (IIS) 中返回 "Task<int>"而不是 "int"的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21987554/