Стоит ли ждать ValueTask <T>? - PullRequest
       17

Стоит ли ждать ValueTask <T>?

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

Какова будет правильная реализация ValueTask, пожалуйста?Служба кэширования возвращает данные либо из кэша, либо из БД.

public async ValueTask<IList<HrEmploymentDataCustom>> GetEmployeesFacts()
{
    try
    {
        var facts = (List<HrEmploymentDataCustom>) _memoryCache.Get("facts");
        return facts ?? await _accountService.GetEmploymentFacts(DetailsRequestType.All, null);
    }
    catch (Exception e)
    {
        var tc = new TelemetryClient();
        tc.TrackException(e);
        return null;
    }
}

Будет ли это: var employeesFacts = await _cacheService.GetEmployeesFacts();

или var employeesFacts = _cacheService.GetEmployeesFacts().Result;

Здесь немного запутано.

1 Ответ

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

Будет ли это:

var employeesFacts = await _cacheService.GetEmployeesFacts();

Обычно да.

или

var employeesFacts = _cacheService.GetEmployeesFacts().Result;

Немного смущен здесь.

НИКОГДА.

Давайте не будем вас обманывать.

Первое: задача значения - это просто задача, которая копируется по значению, а не по ссылке. Не используйте ValueTask, если вы не знаете разницу и у вас есть причина для этого, основанная на эмпирическом исследовании производительности, которое указывает на то, что регулярные задачи являются значительным фактором давления при сборе.Просто используйте обычные задачи почти все время.

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

Вы никогда не используете .Result для задачи, независимо от того, является ли она значением или ссылкой.Зачем?Потому что предположим, что задача не завершена: тогда Result будет синхронно ждать ее завершения. Предположим, что последний шаг рабочего процесса находится в очереди текущего потока, ожидающего отправки .Вы просто положите эту нить спать!Теперь нить спит, ожидая, что сама разбудит ее, и поэтому она будет спать вечно.Никогда не используйте .Result.Почти всегда это неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...