我正在开发一项网络服务,以从 3rd 方提要中读取数据,对其进行一些修改并存储它,然后将其返回给我的客户。它只需要定期从第 3 方站点更新。它将作为 WCF 服务在 Azure 中的 Web 角色中运行。
起初我以为我总是会调用我的 parsefeed 方法,但如果最后一次更新太早,则让该调用返回......
public void ParseFeed()
{
if (DateTime.Now > lastrun.AddMinutes(1))
{
//Fetch updated data into something shared here.
//thedata is a public static in Global class
thedata = fetchdata();
lastrun=DateTime.Now;
}
}
但我猜想,由于提取可能需要 1-2 秒(它是一项 Web 服务),因此多个用户会同时访问该代码。
来自http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312607 因为任何类(包括应用程序类)的静态成员都不是线程安全的,所以用户代码必须为访问静态成员。这适用于您添加到应用程序类的任何静态成员。
我可以使用锁定(不确定如何) 编辑:这里有很多信息
我可以避免使用静态变量并使用缓存,并将我的数据放入其中(但在到期时会被删除,并且多个用户会尝试获取数据)
我可以使用带有假数据的缓存(基本上作为计时器)并在过期时刷新 - 但即使没有人访问该站点也会刷新。(也可能不是线程安全的)
我不能真正使用输出缓存,因为客户端以一种可能使每个请求唯一的方式查询我返回的数据:我的服务根据请求进行排序和过滤
顺便说一句,我不担心 Azure 上多个实例的结果一致性。每个人都可以自己获取,所以我不需要在多个服务器上共享状态。
我觉得有一个简单的解决方案,我完全错过了。想法?