C# 关于WCF中的异步

C# 关于WCF中的异步,c#,.net,web-services,wcf,asynchronous,C#,.net,Web Services,Wcf,Asynchronous,我正在开发一个只接受HTTP的WCF RESTful web服务。关于更改为异步模式,我没有什么问题 几乎所有演示如何使用TPL实现异步WCF操作契约的示例都使用基于WCF客户端代理的客户端,在我的示例中,客户端可能是只支持HTTP谓词的浏览器,因此将我的WCF服务更改为异步模式似乎意义不大。我可以说,如果一个服务是RESTful的,并且处理每个请求不需要很长时间,那么将服务同步更改为异步将不会给我带来很多好处吗 如果我的服务操作契约是单向服务或不向客户端返回任何内容,则操作契约应定义为异步任务

我正在开发一个只接受HTTP的WCF RESTful web服务。关于更改为异步模式,我没有什么问题

  • 几乎所有演示如何使用TPL实现异步WCF操作契约的示例都使用基于WCF客户端代理的客户端,在我的示例中,客户端可能是只支持HTTP谓词的浏览器,因此将我的WCF服务更改为异步模式似乎意义不大。我可以说,如果一个服务是RESTful的,并且处理每个请求不需要很长时间,那么将服务同步更改为异步将不会给我带来很多好处吗

  • 如果我的服务操作契约是单向服务或不向客户端返回任何内容,则操作契约应定义为
    异步任务DoSthAsync()
    无效DoSth()
    ?这里有什么区别?换句话说,我应该等待/返回任务。运行还是不运行

  • 我的服务接受使用HTTP POST从客户端发送的大块数据,假设处理需要一段时间,因此更改为异步模式可以提高服务并发性和吞吐量,如何确保WCF在
    Task.Run(()=>{})
    delegate中不处理传入流对象

  • 1.几乎所有演示如何使用TPL实现异步WCF操作契约的示例都使用基于WCF客户端代理的客户端,在我的情况下,客户端可能是只支持HTTP谓词的浏览器,因此将我的WCF服务更改为异步模式似乎意义不大。我可以说,如果一个服务是RESTful的,并且处理每个请求不需要很长时间,那么将服务同步更改为异步将不会给我带来很多好处吗

    问题1是完全错误的,因为你说你想在WCF服务器端而不是客户端使用TPL


    @我对客户没有任何假设。这里我完全关注服务器端

    2.如果我的服务操作契约是单向服务或不向客户端返回任何内容,则操作契约应定义为异步任务DoSthAsync()或void DoSth()?这里有什么区别?换句话说,我应该等待/返回任务。运行还是不运行

    您没有在服务合同中指定服务是否异步。这是您服务的内部内容。无论您的服务是否异步执行操作,客户端仍然可以同步或异步调用您的服务。例如,如果您的服务将内容写入一个文件,并且写入需要5分钟,并且您已经实现了同步,那么客户端仍然可以异步(或同步)调用您的服务。如果已异步实现此功能,则处理该调用的线程池线程将可以自由处理其他调用。换句话说,这些更改只会影响服务器端

    还请记住,如果您正在做的事情是真正异步的,那么异步进行将是有益的。如果您正在执行CPU密集型操作,那么异步操作实际上会影响性能。为什么?因为当一个请求到达ASP.NET(WCF、MVC、Web表单或其他)时,处理该请求的最有效方法是使用一个线程池线程。如果您正在执行CPU密集型操作,那么无论是该线程执行该操作,还是启动
    任务
    并由另一个线程接管,都不会有什么不同。但是,您将为切换上下文付出代价

    3.我的服务接受使用HTTP POST从客户端发送的大块数据,假设处理需要一段时间,因此更改为异步模式可以提高服务并发性和吞吐量,如何确保传入流对象不被WCF在Task.Run(()=>{})委托中处理

    当请求到达WCF门时,无论是异步处理还是同步处理,除非整个操作完成,否则不会发送响应。那么,为什么要处理传入的流呢

    我认为您不清楚整个异步概念。无论您的服务是异步的还是非异步的,客户端仍然需要确保调用没有阻塞。例如,如果客户端调用操作,则它们可以:

  • 等待,直到他们收到响应,而不做任何其他或其他事情
  • 调用服务,做其他事情,一旦响应返回,他们就会处理响应
  • 1.几乎所有演示如何使用TPL实现异步WCF操作契约的示例都使用基于WCF客户端代理的客户端,在我的情况下,客户端可能是只支持HTTP谓词的浏览器,因此将我的WCF服务更改为异步模式似乎意义不大。我可以说,如果一个服务是RESTful的,并且处理每个请求不需要很长时间,那么将服务同步更改为异步将不会给我带来很多好处吗

    问题1是完全错误的,因为你说你想在WCF服务器端而不是客户端使用TPL


    @我对客户没有任何假设。这里我完全关注服务器端

    2.如果我的服务操作契约是单向服务或不向客户端返回任何内容,则操作契约应定义为异步任务DoSthAsync()或void DoSth()?这里有什么区别?换句话说,我应该等待/返回任务。运行还是不运行

    您没有在服务合同中指定服务是否异步。这是您服务的内部内容。无论您的服务是否异步执行操作,客户端仍然可以同步或异步调用您的服务。例如,如果您的服务将内容写入一个文件,并且写入需要5分钟,并且您已经实现了同步,那么客户端仍然可以异步(或同步)调用您的服务。如果已异步实现此功能,则处理该调用的线程池线程将可以自由处理其他调用。换句话说,这些更改只会影响服务器端

    也要记住,如果你正在做的事情是