Jes*_*ter 10 .net c# task-parallel-library fire-and-forget async-await
我正在开发一个Web API项目,该项目使用Azure的托管缓存服务将数据库结果缓存到内存中,以缩短响应时间并减轻数据库的重复流量.尝试在缓存中放入新项时,有时会抛出特定于缓存的异常,代码为DataCacheErrorCode.RetryLater.当然,为了以后重试而不需要阻止这种方法,我做了它async并await Task.Delay在稍后再试一次.以前,开发人员已经Thread.Sleep在那里硬编码,这确实会损害应用程序性能.
方法签名看起来与此类似:
public static async Task Put(string cacheKey, object obj)
Run Code Online (Sandbox Code Playgroud)
在此更改之后,我从应用程序中的所有其他位置获得~75个编译器警告,这些警告调用以前的同步版本Put指示:
因为不等待该调用,所以在调用完成之前继续执行当前方法.考虑将'await'运算符应用于调用的结果.
在这种情况下,由于Put没有返回任何内容,因此我有理由让这个操作发生故障,因为我没有看到任何理由阻止执行调用它的方法.我只是想知道是否存在任何危险或陷阱,Task因为Put可以经常调用在后台运行许多这些即发即弃的操作.或者我应该等待,因为99%的时间我不会得到重试错误,并且Task几乎立即完成.我只是想确保我没有因为有太多线程(或类似的东西)而受到任何处罚.
如果由于Put任何原因有可能抛出任何其他异常,并且await Put每次将对象插入缓存时都不使用,则异常将被丢弃在未返回的Task内容中.如果您使用的是.NET 4.0,则会在Finalizer中重新抛出此异常Task..如果您使用的是.NET 4.5,它将被忽略(这可能并不理想).
想要确保我没有因为有太多线程或类似的东西而受到任何处罚.
我只是这样说清楚.使用时Task.Delay,您不会旋转任何新线程.A Task并不总是等于正在旋转的新线程.具体在这里,Task.Delay内部使用a Timer,因此没有任何线程开销(如果你使用的话,当前被延迟的线程除外await).
| 归档时间: |
|
| 查看次数: |
3083 次 |
| 最近记录: |