我应该等待ValueTask 吗?

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

public async ValueTask<IList> GetEmployeesFacts() { try { var facts = (List) _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;

这里有点困惑。

这会是:

 var employeesFacts = await _cacheService.GetEmployeesFacts(); 

通常是的。

要么

 var employeesFacts = _cacheService.GetEmployeesFacts().Result; 

这里有点困惑。

永远不能。

让我们不相信你。

第一:值任务只是一个由值而不是引用复制的任务。 不要使用ValueTask,除非您知道差异并且有理由这样做,这是由经验性绩效研究推动的,该研究表明常规任务是收集压力的一个重要因素。 几乎所有时间都只使用常规任务。

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

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