首页 > 解决方案 > WCF 异步服务器端 - 正确实现

问题描述

我编写了一些 WCF 服务,我想以最有效的方式编写它们。这意味着服务器端和客户端都将公开异步操作。

客户端

我知道在客户端合同上,我可以通过添加“Assync”后缀来公开异步操作:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    string GetData(int value);

    [OperationContract]
    Task<string> GetDataAsync(int value);
}

服务器端

服务器端对我来说并不那么明显。在服务器端,我只想保留异步操作:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    Task<string> GetDataAsync(int value);
}

根据如何:实现异步服务操作,我应该使用 IAssyncResult:

  [OperationContractAttribute(AsyncPattern=true)]
  IAsyncResult BeginServiceAsyncMethod(string msg, AsyncCallback callback, object asyncState);

然而,这似乎很乏味。

为什么使用 IAssyncResult 而不是基于任务的异步操作的目的是什么,在 WCF 中实现异步服务器端的正确方法是什么?

标签: c#wcfasync-await

解决方案


如果您查看文档(强调我的):

异步编程模型 (APM) 模式(也称为IAsyncResult模式),其中异步操作需要 Begin 和 End 方法(例如,BeginWrite对于EndWrite异步写入操作)。不再建议将此模式用于新开发。有关详细信息,请参阅异步编程模型 (APM)

相对

基于任务的异步模式 (TAP),它使用单一方法来表示异步操作的启动和完成。TAP 是在 .NET Framework 4 中引入的,是 .NET Framework中推荐的异步编程方法。C# 中的asyncandawait关键字和 Visual Basic 语言中的AsyncandAwait运算符添加了对 TAP 的语言支持。有关更多信息,请参阅基于任务的异步模式 (TAP)

所以:

您正在阅读的文章来自 .NET 4.0 之前的时代(所以它已经很老了)。使用Tasks 并忘记它的IAsyncResult存在。


推荐阅读