c# - 类型/接口(interface)契约(Contract)的任务 - 指南?

标签 c# .net design-patterns async-await task

简单的问题:是否有任何指南,由 Microsoft 自己发布或关于在类型和接口(interface)契约(Contract)上声明任务的通用做法?

到目前为止,我见过很多不同的方法:

使用 TAP 的同步和异步(大多数 .NET 类型):

 void DoSomething();
 Task DoSomethingAsync();

仅限 TAP:

 Task DoSomething(); // notice, no 'Async' member naming

拆分契约(Contract):

 interface IDoSomething {

 }

 interface IDoSomethingSync : IDoSomething {
     void DoSomething();
 }

 interface IDoSomethingAsync: IDoSomething {
     Task DoSomething();
 }

...或者最后,只制定一个没有任何任务的契约(Contract),然后交给消费者。

是否有正式的方式来声明这一点?有一段时间,我坚持使用第一个示例,因为它是 .NET 框架中最常见的示例,但即便如此,由于遗留原因,它有时也不一致。

最佳答案

首先,TAP 命名约定总是以 Async 结尾。此规则有一些异常(exception),主要是 Task 类型。

您必须回答的第一个问题是:这是一个包含 I/O 的操作吗? (或者,对于接口(interface),这是一个可能将要有一个异步实现的操作吗?)如果是,那么该方法应该有一个异步签名。

通常不需要匹配同步签名,除非出于向后兼容的原因需要它们。请注意,大多数桌面 .NET API 包括同步和异步版本以实现向后兼容性;较新的类型(例如 UWP、.NET Core)只有异步(用于 I/O 操作)。

Stephen Toub 写了几篇经典博文 Should I expose synchronous wrappers for asynchronous methods?Should I expose asynchronous wrappers for synchronous methods? .剧透警告:两者的答案都是“否”。

关于c# - 类型/接口(interface)契约(Contract)的任务 - 指南?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37870441/

相关文章:

c# - 如何将 T 类型的单个值转换为 IEnumerable<T>?

C#用分钟限制小时

c# - 如何在另一个连接中使用 Sql 连接?

.net - Vb.net 两个逗号分隔的列表

c# - 对基类库和框架类库的困惑

c++ - 如何使用数据访问对象进行序列化和关系数据库数据访问

php - 为什么要使用匿名函数?

wpf - WPF 中使用的模式

c# - 如何测试被吞噬的异常

c# - 为什么我的 for-each 只抛出一个异常?