时间:2010-07-25 22:06:06

标签: c# database long-running-processes

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

  

我不能(我认为)使用默认操作系统任务调度接口的原因是这些需要执行任务以作为新进程被拒绝。我已经开发了我的数据库对象模型,以便在第一次加载(内存引用)时由每个对象类缓存它们,这意味着每个对象仅从内存加载一次,并且该引用用于所有保存

如果您希望所有内容永远保持缓存,那么您需要拥有一个只能永远运行的应用程序。您可以将其设置为Windows服务或普通的Windows应用程序 Windows服务只是符合服务管理器API的普通exe。如果你想制作一个,Visual Studio有一个向你自动生成一些骨架代码的向导。基本上不是Main方法,而是Service类,Run方法,其他一切都是相同的。

如果您愿意,可以使用Windows任务计划程序来安排您的操作。你这样做的方法是在后台运行长时间运行的Windows服务。让它打开TCP套接字或命名管道或东西,然后坐在那里。然后编写一个小“stub”exe,它只是连接到这个套接字或命名管道,并告诉后台应用程序唤醒 当然,这比在后台应用程序中执行sleep要困难得多,但它确实让您拥有更多控制权 - 您可以在不重新启动后台服务的情况下更改睡眠时间,在以下位置运行 - 需求等。


但是,我会考虑你的设计。您依赖长期运行的服务这一事实是一个很大的失败点。如果您的应用需要运行数天,并且您有一个崩溃的错误,那么您必须重新开始。一个更好的架构是遵循Unix模型,在那里你有小的进程启动,做一件事,然后完成(在这种情况下,处理每个游戏模拟,因为它是自己的过程,所以如果一个人死了它不需要主进程或其他模拟下来。)

您尝试长时间运行的主要原因似乎是缓存数据库查询。你真的需要这样做吗?很多时候数据库足够快(他们有自己的缓存,这很聪明)。我见过程序员的一个常见错误就是假设像数据库这样的东西很慢,浪费了大量的时间来优化实际上它会很好