异步方法返回任务但实际上不是异步

时间:2014-09-29 13:48:54

标签: c# .net mongodb asynchronous

正如预期的那样,我得到了场景的编译器警告。然而,所涉及的方法被称为...... Async,因为它们是公共数据IO接口的实现,其具体类有时能够调用其数据存储异步(特别是SQL和Mongo)。

我通常会发出#34; #pragma警告"防止警告,但有一个技术上更好的方法来解决问题。这里的问题是接口暗示(通过命名约定)方法是Async,我喜欢消费者等待我的方法调用那些具体类确实可以进行异步调用的情况 - 所以我不想将接口拆分为异步和非异步调用。

我是否可以使用警告语,或者是否有更深层次的理由发出警告我不理解。

场景是这样的;

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;
    }
}

第二个类将给编译器警告它被声明为异步但没有等待依赖项。两个具体类的内部实现对于消费者是隐藏的,但是命名约定意味着它们应该等待调用返回值;

IGetData dataFetcher = ioc.Resolve<IGetData>();
IEnumerable<Person> people = await dataFetcher.GetPeopleAsync();

我真的不希望他们在编译时看到任何警告 - 但是(例如)Mongo实现不支持Async,但SQL Server支持Async。有没有比使用#pragma停止警告更好的解决方案?

1 个答案:

答案 0 :(得分:2)

我有一个静态TaskHelpers类,其中包含:

public static readonly Task CompletedTask = Task.FromResult<object>(null);

要创建同步实现,我只需执行:

    public Task MyMethodAsync()
    {
        //... Do stuff ...
        return TaskHelpers.CompletedTask;
    }

我使用助手类来缓存已完成的任务。谢天谢地,等待着#39;对已经完成的任务使用快速路径,因此性能影响也不错。