简单的问题:是否有任何指南,由 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/