我想知道写申请的最佳方式是什么。基本上,我有一个多线程的体育仿真项目,可以同时执行不同的游戏模拟。

我将我的匹配存储在具有连接到它的DateTime的SQLite数据库中。

我想编写一个检查每小时的应用程序,以查看是否需要播放任何新的匹配并将这些线程删除。

我不能依赖于任务调度程序每小时执行这一点,因为存在该进程的不同实例将共享(特别是锦标赛对象),我怀疑将在保存后的较新过程被覆盖进入dB。所以理想情况下,我需要编写某种睡眠时间之间的一些长期运行过程。

我写了我的对象模型,以便每个对象只加载一次从内存中加载,因此只要从这个应用程序产生所有模拟线程,它们都不应该覆盖数据。

编辑:关于要求的更多细节

基本上,多个匹配需要能够同时运行。这些匹配可以是任意长度的,因此在另一个开始之前一个结束(实际上,在大多数情况下,在大多数情况下都会在同一执行多个匹配项)。

我设想是一个在后台运行的程序(我猜,我猜?)睡眠60分钟,然后检查数据库以查看是否应该启动任何游戏。如果有任何要启动,它会向熄灭线程来模拟这些游戏,然后重新睡觉。因此,模拟线程正在运行,但“调度”线程睡眠60分钟。

我不能(我认为)使用默认操作系统任务调度界面是这些需要执行任务以将其催发为新进程。我开发了我的数据库对象模型,使得它们是由第一加载(内存参考)上的每个对象类缓存,这意味着每个对象仅从存储器加载一次,并且在所有保存上都使用该引用。这意味着,当每个模拟线程完成并保存其状态时,使用相同的引用(具有更新状态)以保存关闭状态。如果每次都会启动不同的可执行文件,可能会通过每个进程打开不同的内存参考,因此一个进程可以保存到DB中并覆盖由其他过程编写的状态。

服务看起来像去的方式。有没有办法让服务只是睡眠60分钟并在此之后唤醒并执行函数?我觉得让这个标准的控制台应用程序会浪费内存,但我不知道是否有一个有效的方法来做我不知道的。

有帮助吗?

解决方案

如果要使它真的可靠,请使其成为服务。

但我没有看到常规(控制台,Winforms,WPF)应用程序中的任何问题。

也许你可以扩展一点要求。

其他提示

我不能(我认为)使用默认操作系统任务调度界面是这些需要执行任务以将其催发为新进程。我已经开发了我的数据库对象模型,以便由第一负载(内存参考)上的每个对象类缓存,这意味着每个对象仅从存储器加载一次并且在所有保存时都使用该引用

如果您希望所有内容永远保持缓存,那么您确实需要拥有一个简单地运行的应用程序。您可以制作此Windows服务或正常的Windows应用程序。
Windows服务只是一个正常的EXE,符合服务管理器API。如果您想制作一个,Visual Studio有一个向导,它为您自动生成一些骨架代码。基本上代替具有生成的Main类,其中具有生成的Service方法,其他所有内容是相同的。

您可以,如果您愿意,请使用Windows任务调度程序安排您的操作。您所做的方式是在没有任何内容的背景中拥有您的长期运行Windows服务。它是否打开了TCP插座或命名管道或其他东西,只是坐在那里。然后写一个小的“存根”exe,它只能连接到这个套接字或命名管道,并告诉背景应用程序唤醒。
当然,这比在你的后台应用程序中努力工作得多,但它确实让你有很多控制 - 你可以在不重新启动后台服务的情况下更改休眠时间,运行它按需运行等。


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

似乎是您尝试实现它的主要原因是要缓存数据库查询。你真的需要做这个吗?许多时间数据库足够快(他们有自己的高速缓存,这是智能的。我看过程序员的常见错误就是假设像数据库这样的东西很慢,并且在实际情况下浪费一堆时间优化它会很好

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top