网站建设系统认证系统,盘锦建设信息网站,交互式网站设计怎么做,高性能网站建设指南 百度云前言假设有如下代码#xff0c;功能是首先从缓存获取数据#xff0c;如果没有命中缓存#xff0c;则直接从数据库获取#xff1a;var data await GetFromCache();
if (data is null)
{data await GetFromDB();
}对于获取缓存数据#xff0c;我们需要限制一下GetFromCach…前言假设有如下代码功能是首先从缓存获取数据如果没有命中缓存则直接从数据库获取var data await GetFromCache();
if (data is null)
{data await GetFromDB();
}对于获取缓存数据我们需要限制一下GetFromCache方法的执行时间比如 3 秒超过这个时间可以认为拿不到缓存数据应该直接从数据库取值。那么能否在不修改GetFromCache方法的前提下让 Task 超时时自动结束执行思路虽然不能把普通Task变成一个可超时的 Task但是我们可以定时检查任务状态。如果到达超时时间原始 Task 仍未执行完成则跳过该 Task继续执行后续代码。实现为 Task 创建扩展方法public static async TaskT TimeoutT(this TaskT task, int milliseconds)
{var now DateTime.Now.AddMilliseconds(milliseconds);while (DateTime.Now now){if (task.IsCompleted){return await task;}await Task.Delay(100);}return default(T);
}使用也很简单var data await GetFromCache().Timeout(1000);if (data is null)
{data await GetFromDB();
}需要注意的是我们仅仅是不再 await 原始 Task 执行完成并不代表真正地终止了它的运行原始 Task 还是会继续执行只是我们不再关心它的返回结果而已。结论今天我们通过实现 Timeout 扩展方法为异步任务添加了超时功能。添加微信号【MyIO666】邀你加入技术交流群