Как написать асин заданиеТип возврата - PullRequest
0 голосов
/ 19 января 2019

Здесь я написал код async Task> GetCountries (), какой тип возвращаемого значения я упомянул

Repo.cs

public async Task<IEnumerable<Country>> GetCountries()
        {
            var x=  from n in _ConnectToDb.Country
                    orderby n.CountryId
                    select n;
            return x.ToList();
        }

Я назвал это в моем контроллере как

public async Task<ActionResult<Country>> GetCountryRes()
        {
            var x =await ObjRepo.GetCountries();    
            return x;
        }

Я получаю сообщение об ошибке, поскольку Deos не содержит Defination как GetAwaiter

Ответы [ 4 ]

0 голосов
/ 19 января 2019

Для GetCountries у меня есть две версии

public async Task<IEnumerable<Country>> GetCountries()
{
    var x = from n in _ConnectToDb.Country
            orderby n.CountryId
            select n;

    return await Task.FromResult(x.ToList());
}

// I prefer this version 
public Task<IEnumerable<Country>> GetCountries2()
{
    var x = from n in _ConnectToDb.Country
        orderby n.CountryId
        select n;

    return Task.FromResult(x.ToList().AsEnumerable());
}

Контроллер

// Here I change the return value to IEnumerable
public async Task<ActionResult<IEnumerable<Country>>> GetCountryRes()
{
    var x =await ObjRepo.GetCountries();    
    return x;
}
0 голосов
/ 19 января 2019
            public Task<IEnumerable<Country>> GetCountries()
            {
                var x=  from n in _ConnectToDb.Country
                        orderby n.CountryId
                        select n;
                return Task.FromResult(x.ToList());
            }

Это было бы решением в вашем случае.Проблема в вашем коде заключается в том, что вы должны либо повторить команду Task, либо запустить ожидаемый метод в GetCountries().Async ключевое слово само по себе ничего не значит, оно не будет запускать метод асинхронно, оно просто позволит вам использовать await.Так что в вашем случае это излишне

0 голосов
/ 19 января 2019

Синтаксический сахар async в вашем первом методе не нужен и проблематичен, так как вы ничего не ожидаете. Вам просто нужно вернуть Task от вашего результата. Но поскольку вы используете оператор LINQ (то же самое верно для любого метода LINQ), запрос не обрабатывается до тех пор, пока не будет вызван (и также повторно обрабатывается для любых последующих вызовов), поэтому я рекомендую немедленно оценить его:

Task<IEnumerable<Country> GetCountries()
{
  var x = from ...;
  return Task.FromResult(x.ToArray());
}
0 голосов
/ 19 января 2019

Этот ответ отредактирован

Ваш метод настроен на возврат одного Country, но ваш код возвращает IEnumerable<Country>.

Но проблема кажетсярешаться по-разному в зависимости от версии .Net.Если вы используете .Net Core 2.2 (или позже в будущем), это должно работать:

public async Task<ActionResult<IEnumerable<Country>>> GetCountryRes()
{
    var x = await ObjRepo.GetCountries();    
    return x;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...