2014-09-29 4 views
0

Как и ожидалось, я получаю предупреждения о компиляторе для сценария. Однако используемые методы называются ... Async, потому что они являются реализациями общего интерфейса ввода-вывода данных, чьи конкретные классы иногда имеют возможность вызывать свои хранилища данных Async (в частности, SQL и Mongo).Async метод возвращает задачу, но не фактически Async

Обычно я помещаю предупреждение «# прагма», чтобы предотвратить предупреждения, но есть технически лучший способ решить проблему. Здесь проблема заключается в том, что интерфейс подразумевает (посредством соглашения об именах), что методы являются Async, и я бы хотел, чтобы потребитель ожидал мой метод, вызывает те обстоятельства, при которых конкретный класс действительно может вызывать вызовы Async, поэтому я не хочу разделить интерфейс для вызовов Async и non-Async.

Am I Ok, чтобы прагматизировать предупреждения, или есть какая-то более глубокая причина для предупреждения, которое я не понимаю.

Сценарий подобен этому;

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(); 

Я действительно не хочу, чтобы они видели каких-либо предупреждений, когда они компиляции - но (в качестве примера) реализация Монго Безразлично поддержки Async но SQL Server один делает. Есть ли лучшее решение, чем использование #pragma для остановки предупреждений?

+3

Вы должны разместить свой код, это упростит ваше понимание. –

+1

Я смущен вопросом. Если метод не содержит ожиданий, то почему выгодно отметить его async? Не игнорируйте предупреждение. Удалите ключевое слово async. –

+0

@EricLippert, если я ошибаюсь, мешает мне создавать задачу вручную, приводя к созданию более чистого кода. – PhillipH

ответ

2

У меня есть статический TaskHelpers класс, содержащий это:

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

Для создания синхронной реализации, я тогда просто сделать:

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

Я использую вспомогательный класс только для кэширования завершенной задачи. К счастью, «ожидание» использует быстрый путь для уже завершенных задач, поэтому влияние производительности неплохое.

Смежные вопросы