Как и ожидалось, я получаю предупреждения о компиляторе для сценария. Однако используемые методы называются ... 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 для остановки предупреждений?
Вы должны разместить свой код, это упростит ваше понимание. –
Я смущен вопросом. Если метод не содержит ожиданий, то почему выгодно отметить его async? Не игнорируйте предупреждение. Удалите ключевое слово async. –
@EricLippert, если я ошибаюсь, мешает мне создавать задачу вручную, приводя к созданию более чистого кода. – PhillipH