"而不是 "int"的好处-6ren"> "而不是 "int"的好处-考虑一个耗时的同步方法“Foo”: public int Foo(int id) { // Do some expensive calculation return 42; } 还有一-6ren">
gpt4 book ai didi

c# - 在 WCF 或 WebAPI 方法 (IIS) 中返回 "Task"而不是 "int"的好处

转载 作者:太空狗 更新时间:2023-10-30 00:41:14 25 4
gpt4 key购买 nike

考虑一个耗时的同步方法“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com