类型/接口合同上的任务 - 指南?

时间:2016-06-16 22:32:22

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

简单问题:是否有任何指南,要么是微软自己发布的,要么是关于在类型和接口合同上声明任务的常见做法?

到目前为止,我已经看到了许多不同的方法:

使用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框架中最常见的例子,但即便如此,由于遗留原因,它有时也不一致。

1 个答案:

答案 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?。剧透警报:两者的答案都是“不”。