考虑以下界面和实现。
interface IService
{
Task<string> GetAnswer(string question);
}
class SomeService : IService
{
async Task<string> IService.GetAnswer(string question)
{
... code using awaits ...
}
}
class AnotherService : IService
{
Task<string> IService.GetAnswer(string question)
{
return Task.FromResult("I have no idea.");
}
}
根据the Microsoft naming conventions,接口方法应该命名为GetAnswer
还是GetAnswerAsync
?
按照惯例,您将“Async”附加到具有Async或async修饰符的方法的名称。
问题是第一个实现使用async
修饰符,表明它应该接收“Async”方法名称后缀,但第二个实现不使用async
修饰符,表明它不应该收到“Async”方法名称后缀。实现中的两个方法名称被接口强制相同,因此我不得不违反两个类之一的命名约定。
注意我不是在寻找固执己见的答案。考虑多选。 :)
答案 0 :(得分:5)
即使没有XAsync
修饰符,您也应该使用async
,只要该方法代表基于完整任务的异步操作。
要掌握相关技术,您引用的段落告诉您在 async
修饰符时添加异步,但在 isn时不会告诉您该怎么做't 任何。
async
修饰符实际上不是方法签名的一部分,如果没有它,您可以很容易地完成相同的行为。如果您查看Task-based Asynchronous Pattern,则无法找到对特定async
修饰符的引用,而是查找async
方法的更广泛定义。
在.Net框架本身中,您甚至无法知道哪个Async方法实际使用async
修饰符。很多(如果不是大多数)返回TaskCompletionSource.Task
以允许您(作为用户)使用async-await
。例如,这是Stream.WriteAsync
:
public virtual Task WriteAsync(Byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{
// If cancellation was requested, bail early with an already completed task.
// Otherwise, return a task that represents the Begin/End methods.
return cancellationToken.IsCancellationRequested
? Task.FromCancellation(cancellationToken)
: BeginEndWriteAsync(buffer, offset, count);
}