Каковы различия между ожиданием внутри контекста структуры объекта и снаружи? - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь запустить хранимую процедуру SQL асинхронным способом в C #.Я нашел два варианта, и я хотел бы понять разницу между ними:

Мне нужно подождать, прежде чем выйти из оператора using, иначе контекст будет удален:

private async Task<List<Currency>> Test1Async()
{
    using (var dc = new LandmarkEntities())
    {
        return await Task.Run(() =>
        {
            return dc.get_currencies()
            .Select(x => new Currency
            {
                ExchangeRate = x.exchange_rate,
                Mnemonic = x.mnemonic,
            })
            .ToList();
        });
    }
}

Или я возвращаю работающую асинхронную задачу, содержащую контекст структуры сущности, который будет ожидаться где-то еще:

private Task<List<Currency>> Test2Async()
{
    return Task.Run(() =>
    {
        using (var dc = new LandmarkEntities())
        {
            return dc
                .get_currencies()
                .Select(x => new Currency
                {
                    ExchangeRate = x.exchange_rate,
                    Mnemonic = x.mnemonic,
                })
                .ToList();
        }
    });
}

Поскольку get_currencies() является хранимой процедурой, .ToListAsync(); не может использоваться.

1 Ответ

0 голосов
/ 17 сентября 2018

Вы можете использовать .ToListAsync();

private async Task<List<Currency>> Test2Async()
{
    using (var dc = new LandmarkEntities())
    {
        return await dc
            .get_currencies()
            .Select(x => new Currency
            {
                ExchangeRate = x.exchange_rate,
                Mnemonic = x.mnemonic,
            })
            .ToListAsync();
    }
}
...