Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类型/接口合同的任务-指南?_C#_.net_Design Patterns_Async Await_Task - Fatal编程技术网

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

C# 类型/接口合同的任务-指南?,c#,.net,design-patterns,async-await,task,C#,.net,Design Patterns,Async Await,Task,简单问题:关于在类型和接口契约上声明任务,是否有任何由Microsoft自己发布的指南或常见做法 到目前为止,我已经看到了许多不同的方法: 使用TAP的同步和异步(大多数.NET类型): 仅点击: Task DoSomething(); // notice, no 'Async' member naming 拆分合同: interface IDoSomething { } interface IDoSomethingSync : IDoSomething { void D

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

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

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

仅点击:

 Task DoSomething(); // notice, no 'Async' member naming
拆分合同:

 interface IDoSomething {

 }

 interface IDoSomethingSync : IDoSomething {
     void DoSomething();
 }

 interface IDoSomethingAsync: IDoSomething {
     Task DoSomething();
 }
…或者,最后,只是在没有任何任务的情况下订立合同,并将其留给消费者


有官方的方式来宣布这一点吗?有一段时间,我坚持使用第一个示例,因为它是.NET framework中最常见的一个示例,但即使在那里,由于遗留原因,它有时也不一致。

首先,点击命名约定总是以
Async
结尾。此规则有一些例外,主要是在
任务
类型上

您必须回答的第一个问题是:这是一个包含I/O的操作吗?(或者,对于接口来说,这是一个可能具有异步实现的操作吗?)

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


Stephen Toub写了几篇经典的博客文章和文章。剧透警告:这两个问题的答案都是“否”。

无论是搜索非现场资源还是基于观点,这样的问题都是离题的。它以前也被问过很多次——我认为“重复”是一个很好的结束理由,但请随意评论为什么这个问题应该自己结束。@AlexeiLevenkov我在发布这个问题之前做了一次搜索,但没有找到任何有用的结果。此外,这不应该是基于选项的,因为我特别要求提供一个指南(最好是由微软自己提供的),所以要么有一个我找不到的指南,要么没有。我不认为你链接/标记的问题是重复的,因为OP要求的是命名约定,而不是一般的界面设计准则。artganify声称这个问题是搜索指导,而不是重复-重新打开(可能不会太长)。非常有趣的文章,在将sync包装为async的情况下,两者都很有意义,反之亦然。我唯一不清楚的是您关于接口的声明:“这是一个可能会有异步实现的操作吗?”我们能肯定吗?例如,与域相关的存储库永远不应该公开其基础架构实现中的功能,内存存储库(出于测试目的)当然不需要资源密集型IO。那么,隐藏操作可能异步运行的事实不是更好吗?@artganify:这与
IDisposable
的设计问题是一样的。一个接口如何知道它的任何实现是否需要被处理?在理想情况下,处理和异步都可以被视为实现细节;但这在C/.NET上是不可能的。我从没想过,很有趣。但这也可以通过公开一个属性来解决,该属性告诉使用者实现是否需要处置,就像ICollection for instances有一个“IsReadOnly”一样。
 interface IDoSomething {

 }

 interface IDoSomethingSync : IDoSomething {
     void DoSomething();
 }

 interface IDoSomethingAsync: IDoSomething {
     Task DoSomething();
 }