1

我想知道编写应用程序的最佳方式是什么。基本上,我有一个多线程的运动模拟项目,可以同时执行不同的游戏模拟。

我将匹配项存储在附加了 DateTime 的 SQLite 数据库中。

我想编写一个应用程序,每隔一小时左右检查一次,看看是否需要播放任何新的比赛并产生这些线程。

我不能依赖任务调度程序每小时执行一次,因为该进程的不同实例会共享一些对象(特别是锦标赛对象),我怀疑这些对象在保存回数据库时会被更新的进程覆盖. 所以理想情况下,我需要编写一些在几个小时之间休眠的长时间运行的进程。

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

编辑:有关要求的更多详细信息

基本上,多个比赛需要能够同时运行。这些匹配可以是任意长度,因此没有必要让一个在另一个开始之前完成(事实上,在大多数情况下,会同时执行多个匹配)。

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

我不能(我认为)使用默认操作系统任务调度接口的原因是这些需要执行的任务作为新进程被拒绝。我已经开发了我的数据库对象模型,以便它们在第一次加载(内存引用)时由每个对象类缓存,这意味着每个对象只从内存中加载一次,并且该引用用于所有保存。这意味着当每个模拟线程完成并保存其状态时,使用相同的引用(具有更新的状态)来保存状态。如果每次启动不同的可执行文件,则可能每个进程都会打开不同的内存引用,因此一个进程可以保存到数据库中并覆盖另一个进程写入的状态。

服务看起来像是要走的路。有没有办法让服务只睡 60 分钟,然后醒来并执行一个功能?我觉得把它作为一个标准的控制台应用程序会浪费内存,但我不知道是否有一种有效的方法来做我不知道的事情。

4

2 回答 2

2

如果你想让它真正可靠,就让它成为一项服务。

但我认为使它成为一个普通的(控制台、WinForms、WPF)应用程序没有任何问题。

也许您可以稍微扩展一下要求。

于 2010-07-25T22:37:39.250 回答
0

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

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

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


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

It seems like the main reason you're trying to have it long-running is to cache your database queries. Do you actually need to do this at all? A lot of the time databases are plenty fast enough (they have their own caches, which are plenty smart). A common mistake I've seen programmers make is to just assume that something like a database is slow, and waste a pile of time optimizing when in actual fact it would be fine

于 2010-07-26T20:41:21.143 回答