简单问题:是否有任何指南,要么是微软自己发布的,要么是关于在类型和接口合同上声明任务的常见做法?
到目前为止,我已经看到了许多不同的方法:
使用TAP同步和异步(大多数.NET类型):
void DoSomething();
Task DoSomethingAsync();
仅限TAP:
Task DoSomething(); // notice, no 'Async' member naming
拆分合同:
interface IDoSomething {
}
interface IDoSomethingSync : IDoSomething {
void DoSomething();
}
interface IDoSomethingAsync: IDoSomething {
Task DoSomething();
}
......或者最后,只是签订一份没有任何任务的合同,并将其留给消费者。
有没有官方的方式来宣布这个?有一段时间,我坚持第一个例子,因为它是.NET框架中最常见的例子,但即便如此,由于遗留原因,它有时也不一致。
答案 0 :(得分:3)
首先,TAP命名约定总是以Async
结束。此规则有一些例外,主要是Task
类型。
您必须回答的第一个问题是:这是一个包含I / O的操作吗? (或者,对于接口,这是一个可能将具有异步实现的操作?)如果是,那么该方法应具有异步签名。
通常不需要匹配同步签名,除非出于向后兼容性原因需要它们。请注意,大多数Desktop .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?。剧透警报:两者的答案都是“不”。