Вызов не асинхронных методов - PullRequest
0 голосов
/ 03 ноября 2019

Иметь библиотеку классов, которая использует DbContext для возврата результатов из sql. Если я хочу создать

метод библиотеки классов, это может занять несколько секунд. Этот класс внедряется в основное веб-приложение asp.net при его запуске

class Util
{

    public string DoStuff(string colorVal) {

        string ourValue = (from a in ctx.BigTable where a.color == colorVal select a.DoneFlag).FirstOrDefault();

        return ourValue;

    }
}

Нужно ли сделать этот метод асинхронным также, если я собираюсь использовать его из кода, подобного этому

Web project

        Util o;

        public async Task<IViewComponentResult> InvokeAsync()
        {
            var item = await GetMatchingColorAsync();
            return View(item);
        }

        private Task<string> GetMatchingColorAsync()
        {
            string matchingColor = o.DoStuff("red");            
            return Task.FromResult(matchingColor);
        }

1 Ответ

1 голос
/ 03 ноября 2019

В идеале да. Вы могли бы даже использовать FirstOrDefaultAsync, пока вы работаете с ним (в зависимости от того, какой у вас базовый источник данных):

public async Task<string> DoStuff(string colorVal) {

    string ourValue = await (from a in ctx.BigTable where a.color == colorVal select a.DoneFlag).FirstOrDefaultAsync();

    var someColor = await GetMatchingColorAsync();

    return ourValue;

}

У Microsoft есть серия статей о Асинхронном программировании с асинхронностью и ожиданием , которые довольно хорошо написаны. Они того стоят.

Если вы абсолютно не можете изменить методы вызова, тогда вы можете просто синхронно ждать:

public string DoStuff(string colorVal) {

    string ourValue = (from a in ctx.BigTable where a.color == colorVal select a.DoneFlag).FirstOrDefault();

    var someColor = GetMatchingColorAsync().GetAwaiter().GetResult();

    return ourValue;

}

Легко, верно? За исключением того, что он блокирует поток (вы теряете преимущество асинхронных методов) и рискуете зайти в тупик, как описано в этой статье: Не блокировать асинхронный код .

Это плохо ™

...