C# WCF异步服务器端处理

C# WCF异步服务器端处理,c#,.net,wcf,asynchronous,C#,.net,Wcf,Asynchronous,我需要创建一个WCF服务,该服务接受客户端请求,并在内部连接到远程机器以完成此任务。远程机器有很好的处理能力,但处理速度不好。这意味着可以每秒处理1000个事务,但每个事务可能需要1秒,因此唯一的方法是在同一秒内运行1000个并发事务 远程机器可以很好地处理这种情况,但我担心WCF,如果每个事务在内部(我不关心客户端模型(同步或异步))等待并阻塞服务器内的线程1或2秒,这可能表示有1000个工作线程在运行,这可能非常危险,或者WCF使用线程池,将其他请求置于等待状态,这也很糟糕 因此,我的问题是

我需要创建一个WCF服务,该服务接受客户端请求,并在内部连接到远程机器以完成此任务。远程机器有很好的处理能力,但处理速度不好。这意味着可以每秒处理1000个事务,但每个事务可能需要1秒,因此唯一的方法是在同一秒内运行1000个并发事务

远程机器可以很好地处理这种情况,但我担心WCF,如果每个事务在内部(我不关心客户端模型(同步或异步))等待并阻塞服务器内的线程1或2秒,这可能表示有1000个工作线程在运行,这可能非常危险,或者WCF使用线程池,将其他请求置于等待状态,这也很糟糕

因此,我的问题是关于在服务器端异步处理请求的可能性。因此,事务流必须如下所示:

  • 客户初始化一个请求(在他这边是一个同步请求)
  • 服务器接收请求并将此请求放入事务队列中,然后释放线程
  • 当任务完成时,服务器完成向客户端发送HTTP 200和结果的请求

  • 谢谢

    您可以使用WCF异步模式来实现这一点。当您使用async属性标记operationContract时,WCF使用IO CompletionPort线程来处理请求

    因此,它的工作方式如下。您的请求由IIS中的一个线程处理,一旦它到达WCF,它将进入睡眠状态,然后IO CompletionPort线程将处理该请求,然后将响应发送回IIS线程,IIS线程将响应返回给客户端

    IO CompletionPort线程速度更快,而且不会降低服务器的性能或资源


    有关详细信息,请参阅以下内容。

    在中间层服务器中,根据异步模式声明并实现您的操作:

    [OperationContract(Action = "DoSomething", AsyncPattern = true)]
    IAsyncResult BeginDoSomething(AsyncCallback asyncCallback, object asyncState);
    void EndDoSomething(IAsyncResult iar);
    
    BeginDoSomething的实现应该将请求发送到远程机器并立即返回。
    当你在客户端调用DOMMETHONSE()时,中间层的WCF会意识到这个操作是异步的开始/结束对并适当地调用它。

    如果你在IIS中服务你的WCF服务,你就不需要做上面的任何一个。IIS将为每个请求启动一个单独的线程,实例化wcf的新实例,处理请求并返回结果。如果现有线程可用,IIS将使用它而不是假脱机新线程。这并不能解决我的线程“饱和”问题,我需要的异步处理不是线程重用,而是如何做到这一点。使用一个简单的参数是不可能释放一个线程,该线程正在等待来自外部机器的数据库o的响应。异步必须由开发人员实现,只有开发人员知道在异步完成事件后事务如何恢复。您的目标是避免IIS和WCF之间的线程阻塞,而不是WCF和数据库之间的线程阻塞(例如)。您的意思是,在进程完成之前,您根本不希望线程被阻塞。在这种情况下,您可以采取IsOneWayOperation,其中客户端只是发出请求并忘记。如果希望客户端返回响应,请尝试实现全双工场景,其中客户端指定对服务器的回调,处理完成后,服务器将执行回调以更新状态。我发现async/await usign任务类可能是解决方案,我将对此进行研究。