c# - 编写一个长时间运行的基于时间的进程

标签 c# database long-running-processes

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

我将我的比赛存储在一个附加了日期时间的 SQLite 数据库中。

我想编写一个应用程序,每隔一小时左右检查一次,看看是否需要进行任何新的比赛,然后关闭这些线程。

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

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

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

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

我设想的是一个在后台运行的程序(我猜是一项服务?),它会休眠 60 分钟,然后检查数据库以查看是否应该启动任何游戏。如果有任何要开始的游戏,它会触发线程来模拟这些游戏,然后再回到 sleep 状态。因此,模拟线程正在运行,但"dispatch"线程又休眠了 60 分钟。

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

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

最佳答案

如果你想让它真正可靠,就把它变成服务。

但我没有发现将它变成普通(控制台、WinForms、WPF)应用程序有任何问题。

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

关于c# - 编写一个长时间运行的基于时间的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3331206/

相关文章:

c# - ImageResizer - 转换 PSD 文件时出错 - System.ArgumentException : Parameter is not valid

c# - 用wmd上传图片?

c# - Rhino Mocks 的新语法

c# - 使用 WatiN 脚本将击键(即 Enter Key)传递到应用程序

database - 基于分布式SOA架构的系统压力测试

transactions - SAGA代表什么?

php - 最后插入 id 值存储到同一个表的另一个特定列

database - 如何在 DBeaver 中设置默认架构?

azure - 运行长时间运行流程的最佳且具有成本效益的方式

linux - 当唯一的访问是通过 FTP 时,如何终止 Linux 进程?