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

标签 c# wcf iis task-parallel-library task

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

相关文章:

c# - 如何从 HttpContext.Current.Request 获取 URL 的 # 部分

c# - "Invalid managed/unmanaged type combination."是什么意思?

IIS 7 URL 重写规则似乎只工作一次

c# - 在维护 session 的同时将网络场迁移到 asp.net 的运行时版本 4

IIS Url Rewriter 重写失败,但重定向工作正常

c# - 没有管理员权限无法启动 nancy self host

C# double 进入 MySql db double 不工作

silverlight - 了解 WCF 的工作原理

asp.net - 在从 net.tcp 协议(protocol)连接到 WCF 的端点处监听的问题

c# - 如何在可移植类库中使用 wcf 服务并想在 xamarin 中的共享项目(我正在使用 Xamarin.Forms Portable)中添加引用?