首页 \ 问答 \ 客户端缓存C#(Clientside Caching C#)

客户端缓存C#(Clientside Caching C#)

我的wpf客户端在启动时从服务器加载了大量的常备数据。 所以,我想在客户端实现缓存策略。

我知道.NET框架中新的System.Runtime.Caching命名空间4.不幸的是,只有内存缓存。 我不希望在每次启动客户端时加载大量数据。 所以我正在寻找持久的客户端缓存。


另一个想法是我使用OODB(如db4o或VelocityDB)进行客户端缓存。 这是一个坏主意吗? 我没有客户端缓存方面的经验。



My wpf client is loading a lot of standing data at startup from the server. So, I want to implement a caching strategy at client side.

I know about the new System.Runtime.Caching namespace in the .NET framework 4. Unfortunately, there is only a memory caching. I don't want to load the huge amount of data at each startup of the client. So I'm searching for a persistent client caching.

What do you think about it?

Another idea was I use an OODB (like db4o or VelocityDB) for client caching. Is this a bad idea? I haven't any experience in client caching.

Thanks for your answers and suggestions.

Kind regards, pro

更新时间:2019-09-10 17:12


如何在客户端存储数据并不重要。 不过,我会考虑使用IsolatedStorage。 可能更难的是告诉缓存何时变为陈旧。 这实际上是System.Runtime.Caching所擅长的。 服务器数据是根本更改,还是仅在应用程序的新版本发生后更改? 如果数据仅在新版本之后发生更改,您可能希望将其作为资源包含在应用程序设置中。 如果没有,您必须有一些超时或信号告诉客户端是时候检查服务器上的更改数据了。 您是否已经考虑过延迟加载数据? 这样,延迟可能不会在应用程序启动时发生,并且不太明显,甚至可能您甚至不必将完整数据加载到客户端。

关于超时:在我们的应用程序中,我们有一个固定的超时,它在第一次加载时设置为每个引用列表,每次从缓存请求时,都会检查超时。 如果它已过期,则在返回列表之前透明地刷新缓存。 这是一种权衡,因为客户端的数据可能已经陈旧一段时间了。 我们接受这一点,因为它在我们的情况下并不重要,并且每个列表都负责自己,并且我们不需要中央注册表跟踪每个列表的状态以便从外部设置超时。

How you store the data on the client side doesn't matter very much. I'd look into IsolatedStorage for your purposes, though. What might be more difficult is to tell when the cache turns stale. This is actually what System.Runtime.Caching is good at. Does the server data change at all, or only after a new release of the application? If the data changes only after a new release, you might want to include it as resources into the application setup. If not, you'd have to have some timeout or signal which tells the client that it is time to check for changed data on the server. Have you already considered lazy loading of the data? That way, the delay would probably not occur all at application startup and would be less noticable, and probably you wouldn't even have to load the complete data into the client.

Regarding Timeouts: in our application, we have a fixed timeout which is set to each reference list when it is first loaded, and every time it is requested from the cache, that timeout is checked. If it has expired, the cache is transparently refreshed before the list is returned. This is a tradeoff, because the data on the client side could be stale for some time. We accept this, because it isn't critical in our case, and that way every list is responsible for itself and we don't need a central registry keeping track of each list's state in order to set the timeout from outside.




SQL语法中的错误(Errors in SQL Syntax)

不要通过字符串格式传递查询参数。 让mysql客户端通过将参数传递给execute()的第二个参数中的查询来完成工作。 除了没有报价和数据类型转换问题,您将避免SQL注入风险: query = """INSERT INTO page_load_times (self, object_id, page_header, elapsed_time, date_run) VALUES (

如何构建基于安全计时器的按钮?(How can I build a secure timer based button?)

我不想说它萌芽,但javascript中没有安全的东西。 具有一点知识的用户将能够对您的代码执行任何他们想要的操作。 但要尝试提出建议 if (minutes == "00" && seconds == "00" && timerIntervalId != undefined) { clearInterval(timerIntervalId); ///document.getElementById("button").style.display = 'block';

将nio套接字替换为exec用于二进制协议的软件(Replace nio sockets to exec'ed software for binary protocol)

我找到了正确的方法。 我对每个流和同步线程使用同步查询来填充或擦除查询。 所有线程相互阻塞自己。 它的工作原理! :)抱歉打扰了。 I've found right way. I uses syncchronized queries for each stream and synchronized threads to fill or erase that queries. All threads mutually blocks themselves. And it works! :) Sorr

将双精度数舍入到以位数给出的较低精度的有效方法(Efficient way to round double precision numbers to a lower precision given in number of bits)

Dekker的算法将浮点数分成高低部分。 如果有效数据中有s位(IEEE 754 64位二进制中有53位),则*x0接收高s - b位,这是您请求的位, *x1接收剩余位,您可以丢弃这些位。 在下面的代码中, Scale应具有值2b 。 如果b在编译时已知,例如常量43,则可以用0x1p43替换Scale 。 否则,你必须以某种方式产生2 b 。 这需要圆到最近的模式。 IEEE 754算术就足够了,但其他合理的算法也可以。 它将关系变为偶数,这不是你要求的(向上绑定)。 这有必要吗? 这假设x

如何在源代码文件中检测每个JavaDoc块的开始和结束行?(How to detect each JavaDoc block start-and-end line in a source-code file?)

这将获取Java源代码文件的路径,并输出每个找到的JavaDoc块的开始和结束行。 import java.io.File; import java.io.IOException; import java.util.regex.Pattern; import org.apache.commons.io.FileUtils; import org.apache.commons.io.LineIterator; import xbn.io.RTIOEx

匹配具有相同值SQL的多个列(Match multiple columns with same value SQL)

缺少动态sql,你必须拼出每个列名。 但是你可以得到一些语法快捷方式,只列出常量一次: SELECT * FROM table WHERE 'xyz' IN (akey1, bkey2, ckey3) 使用动态sql,您仍然必须发出相同的查询...但您至少可以使用字符串工具来构建它,如果您想使用通配符匹配,可以查看information_schema.columns视图来查找它们。 但是,这涉及打开和迭代游标或将列数据返回给客户端,其中任何一项涉及的工作多于仅列出原始查询中的列名。 希望您在开

SWIG - 封装到C#时,没有std :: list的默认类型映射,我该怎么办?(SWIG - No default typemap for std::list when wrapping to C#, how can I do?)

那么,对于像我一样面临同样问题的人,我最终决定将自己的std :: list实现为C#LinkedList。 我今天在SWIG GitHub上提出了一个pull请求。 如果有人有兴趣,去检查一下。 这不是完美的,但现在工作。 Well, for those who are facing the same issue like I was, I finally decided to make my own implementation of std::list to C# LinkedList.

分解一个重载的函数调用(Factoring out an overloaded function call)

一个可能的解决方案是使用lambda: template<typename T> static function doAlg(T fct) { // Common code, use fct() instead of f(a,b) or f(b) } void alg(A &a, B*b) { doAlg([&a, b](){ f(a,b); }); // when doAlg call fct(), it will call f(a,b); } void alg(B*b)




  • asp.net任意用户信息(asp.net arbitrary user info)
  • 如何使用python计算docx文件中表中行的值(How to count the row's values in tables in docx file by using python)
  • MySQL:用户访问和数据库覆盖(MySQL: User access and DB overwriting)
  • 还有另一种“使用未分配的局部变量”的问题(Yet Another “Use of unassigned local variable 'whatever' ” question)
  • 开源证书颁发机构软件(Open source certificate authority software)
  • Rails中的迭代form_for是在create上添加模型的所有实例(Iteration in Rails form_for is adding all instances of model on create)
  • 如何扩展我的表视图单元格?(How to expand my table view cell?)
  • 如何使用SPARQL区分Thing和无生命对象(How to differentiate between a Thing and an inanimate object with SPARQL)
  • 在IdentityServer中,Client Secrets和Scope Secrets有什么区别?(In IdentityServer, what is the difference between Client Secrets and Scope Secrets?)
  • 如何在具有附加类时重写类(How do I override a class when it has a attached class)
  • 如何使用Git在Azure上部署C#,MVC4应用程序(How to deploy a C#, MVC4 application on Azure using Git)
  • Sitecore 7内容搜索爬网程序根目录之外的索引项(Sitecore 7 Content Search indexing items outside of crawler root)
  • 我应该在线课程使用utf-8编码吗?(Should I use utf-8 encoding for an online course?)
  • 如何在Cucumber-JS步骤定义中使用Node-mysql连接到MySQL?(How to connect to MySQL using Node-mysql in a Cucumber-JS step definition?)
  • 在MVC 4中的google.maps.LatLng(lat,lon)中将JSON字符串值分配给纬度和经度(Assign the JSON string value to Latitude and Longitude in google.maps.LatLng(lat,lon) in MVC 4)
  • awk:通过特定的分隔符删除字符串(awk: remove strings by specific delimiter)
  • 如何测试Vista的应用程序(How to test app for Vista)
  • Elasticsearch聚合器 - 缺失值的工作原理(Elasticsearch aggregators - How missing values work)
  • 绘制datetime.date熊猫(Plot datetime.date pandas)
  • PostgreSQL作为WSO2 EI和APIM + IS的数据源(PostgreSQL as datasource for WSO2 EI and APIM+IS)
  • 如何使用bash在postgres中运行alter table脚本(How to run alter table script in postgres using bash)
  • 可能使用PHP阻止整个美国州访问我的网站?(Might it be possible to block an entire US state from accessing my site, using PHP?)
  • restangular删除并输入错误网:: ERR_NAME_NOT_RESOLVED(restangular remove and put error net::ERR_NAME_NOT_RESOLVED)
  • 常见问题解答的Modx(Revolution)搜索功能(Modx(Revolution) search function for FAQs)
  • Rubymine如何使用远程口译员和Git?(How Does Rubymine Work With Remote Interpreters and Git?)
  • prepareForSegue和PerformSegueWithIdentifier发件人(prepareForSegue and PerformSegueWithIdentifier sender)
  • postgrsql与PowerShell无提示安装问题(postgresql silent installation issue with powershell)
  • 比较两个greps的输出(Comparing output from two greps)
  • 使用.NET RIA Data Services删除Silverlight 3中的数据(Deleting data in Silverlight 3 with .NET RIA Data Services)
  • 此行中AND运算符的含义(meaning of the AND operator in this line)