返回任务是否违反了 CQS 原则?

Is returning a Task violating the CQS-principle?

那么,如果我写一个异步命令,是否会不可避免地破坏 CQS 原则?

处理async时Task表示void,Task<T>表示"a result"。所以不,它不违反 CQS 你只需要将 Task 视为 void.

来自您链接的文章:

When converting from synchronous to asynchronous code, any method returning a type T becomes an async method returning Task<T>, and any method returning void becomes an async method returning Task.

因此返回 Task(不是 Task<T>)转换为具有返回 void 的方法。

在考虑你想知道什么(查询)或做什么(命令)的层面上,Task<T> 为你提供数据,因此对于查询是正确的,而 Task 不是,并且因此对于命令是正确的。 ("return void" 是某些语言表达 "do not return data" 的特定语言方式)。

在此级别下,您正在考虑管理异步操作的机制,然后您总是希望获得有关异步操作状态的信息,因此总是需要某种任务对象。那不是考虑命令查询分离的级别。

相比之下,如果一个 .NET 方法调用一个 COM 方法,它将调用一个始终返回指示成功或失败的值的代码。这只是异常处理如何在该特定技术中发生的实现细节。根据您的工作水平来考虑这个问题是重要的还是无关紧要的。 Task 是基于任务的异步编程如何工作的实现细节。根据你的工作水平来考虑这个问题是重要的还是无关紧要的。

您需要考虑 "is this a command or a query" 的级别,Task 是关于如何获得 void 的实现细节。