c# - 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 中实现异步服务器端的正确方法是什么?
解决方案
如果您查看文档(强调我的):
异步编程模型 (APM) 模式(也称为
IAsyncResult
模式),其中异步操作需要 Begin 和 End 方法(例如,BeginWrite
对于EndWrite
异步写入操作)。不再建议将此模式用于新开发。有关详细信息,请参阅异步编程模型 (APM)。
相对
基于任务的异步模式 (TAP),它使用单一方法来表示异步操作的启动和完成。TAP 是在 .NET Framework 4 中引入的,是 .NET Framework中推荐的异步编程方法。C# 中的
async
andawait
关键字和 Visual Basic 语言中的Async
andAwait
运算符添加了对 TAP 的语言支持。有关更多信息,请参阅基于任务的异步模式 (TAP)。
所以:
您正在阅读的文章来自 .NET 4.0 之前的时代(所以它已经很老了)。使用Task
s 并忘记它的IAsyncResult
存在。
推荐阅读
- python - 根据索引值在python中加入2个csv文件
- python-2.7 - SSL 连接错误:SSL 证书验证失败 (2026) (SQLDriverConnect) pyodbc?
- scala - 如何使用@RunWith(classOf[JUnitRunner]) 升级到 JUnit5 进行 Scala 测试?
- python - ttest_ind 给出 TypeError: unsupported operand type(s) for /: 'str' and 'int'
- javascript - React Consumer Context 无法设置状态 - 前端大师介绍 React 课程 v4 重构
- maven - Swagger CodeGen 依赖问题
- sorting - 如何仅根据第一列对行进行排序?
- android - 如何在另一个活动中更新片段和背景
- bash - 我如何解释这个 bash/awk 语法?
- java - 如何用方法引用替换“!= null”语句?