首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该等ValueTask<T>吗?

我应该等ValueTask<T>吗?
EN

Stack Overflow用户
提问于 2018-09-20 12:18:06
回答 1查看 6K关注 0票数 7

请问哪个是ValueTask的有效实现?缓存服务从缓存或DB返回数据。

代码语言:javascript
复制
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;

这里有点混乱。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-20 12:24:37

这会是:

代码语言:javascript
复制
var employeesFacts = await _cacheService.GetEmployeesFacts();

通常是的。

代码语言:javascript
复制
var employeesFacts = _cacheService.GetEmployeesFacts().Result;

这里有点混乱。

永远不要。

让我们解除你的困惑吧。

首先: value任务只是由值而不是引用复制的任务。不使用ValueTask,除非您知道两者之间的差异,并且有理由这样做,这是由一项经验性能研究驱动的,该研究表明,常规任务是造成收集压力的一个重要因素。几乎所有时候都使用常规任务.

您不会根据任务是通过值复制还是通过引用来更改任务的使用方式。不管如何,你都在等待任务。

无论任务是值还是引用,您都不会在任务上使用.Result。为什么?因为假设任务没有完成:那么Result将同步等待它的完成。假设工作流的最后一步当前在等待调度的当前线程的队列中。你刚刚让那根线睡着了!现在线在睡觉,等待自己唤醒它,所以它将永远睡眠。永远不要使用.Result。几乎总是这样做是错误的。

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52425028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档