我正在开发一个 Web API 项目,该项目使用 Azure 的托管缓存服务将数据库结果缓存在内存中,以缩短响应时间并减少数据库的重复流量。当尝试将新项目放入缓存时,有时会抛出特定于缓存的异常,代码为DataCacheErrorCode.RetryLater
。当然,为了稍后重试而不需要阻止这个方法,我做了它async
and await Task.Delay
稍后再试。以前,开发人员硬编码了Thread.Sleep
这确实损害了应用程序的性能。
方法签名现在看起来与此类似:
public static async Task Put(string cacheKey, object obj)
进行此更改后,我从应用程序中调用以前的同步版本的所有其他位置收到了大约 75 个编译器警告Put
表明:
由于不等待此调用,因此在调用完成之前将继续执行当前方法。考虑将“await”运算符应用于调用结果。
在这种情况下,由于Put
不返回任何内容,对我来说让这个操作有意义一劳永逸因为我没有看到任何理由阻止调用它的方法的执行。我只是想知道允许大量此类“即发即忘”是否存在任何危险或陷阱Task
s 在后台运行Put
可以经常调用。或者我应该等待,因为 99% 的时间我不会收到重试错误和Task
几乎会立即完成。我只是想确保我不会因为线程过多(或类似的情况)而受到任何处罚。
如果有机会的话Put
会因任何原因抛出任何其他异常,并且您不使用await Put
每次将对象插入到缓存时,异常都会被返回到返回的对象中Task
这还没有被等待。如果您使用的是 .NET 4.0,此异常将在该版本的 Finalizer 中重新引发Task.
。如果您使用 .NET 4.5,它将被忽略(这可能是不可取的)。
想要确保我不会因为拥有太多而受到任何处罚
许多线程或类似的东西。
我这么说只是为了把事情说清楚。当你使用Task.Delay
,您没有旋转任何新线程。 ATask
并不总是等于正在旋转的新线程。具体在这里,Task.Delay
内部使用一个Timer
,所以没有任何线程开销(除了当前正在延迟的线程,如果您确实使用await
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)