Async方法返回Task,但实际上不是Async
本文关键字:Async 实际上 方法 返回 Task | 更新日期: 2023-09-27 18:24:54
不出所料,我收到了该场景的编译器警告。然而,所涉及的方法被称为。。。。异步,因为它们是通用数据IO接口的实现,其具体类有时能够调用其数据存储Async(特别是SQL和Mongo)。
我通常会放一个"#pragma警告"来防止警告,但有没有技术上更好的方法来解决这个问题。这里的问题是,接口暗示(通过命名约定)方法是异步的,我希望使用者在具体类确实可以进行异步调用的情况下等待我的方法调用,所以我不想将接口分为异步调用和非异步调用。
我可以把警告说出来吗?还是有更深层次的原因导致我不理解这些警告。
场景是这样的;
public interface IGetData
{
Task<IEnumerable<Person>> GetPeopleAsync();
}
public class GetDataViaSQLServer : IGetData
{
public async Task<IEnumerable<Person>> GetPeopleAsync()
{
return await SqlCommand.ExecuteAsync("spoc_getpeople"); // Pseudo code to illustrate the async call
}
}
public class GetDataViaMongo : IGetData
{
public async Task<IEnumerable<Person>> GetPeopleAsync()
{
IEnumerable<Person> people = mongoCollection<Person>(); // Psuedocode illustrating lack of mongo async capability
return people;
}
}
第二个类将向编译器发出警告,称其声明为async,但没有等待依赖项。这两个具体类的内部实现对使用者是隐藏的,但命名约定意味着它们应该等待调用返回值;
IGetData dataFetcher = ioc.Resolve<IGetData>();
IEnumerable<Person> people = await dataFetcher.GetPeopleAsync();
我真的不希望他们在编译时看到任何警告——但(举个例子)Mongo实现不支持Async,但SQL Server实现支持。有比使用#pragma来停止警告更好的解决方案吗?
我有一个静态TaskHelpers
类,其中包含以下内容:
public static readonly Task CompletedTask = Task.FromResult<object>(null);
为了创建一个同步实现,我只需要执行以下操作:
public Task MyMethodAsync()
{
//... Do stuff ...
return TaskHelpers.CompletedTask;
}
我使用helper类只是为了缓存已完成的任务。值得庆幸的是,"等待"为已经完成的任务使用了一条快速路径,因此对性能的影响还不错。