質問

私は申請書を書くための最良の方法が何であるか疑問に思いました。基本的に、私はマルチスレッドで、異なるゲームシミュレーションを同時に実行することができるスポーツシミュレーションプロジェクトを持っています。

私の試合をSQLiteデータベースに保存し、それに添付されているDateTimeを添付しています。

私は毎時チェックするアプリケーションを書いて、新しい一致が再生される必要があるかどうかを確認し、それらのスレッドをオフにする必要があるかどうかを確認したい。

そのプロセスのさまざまなインスタンスが共有されているオブジェクト(特にトーナメントオブジェクト)があるため、タスクスケジューラに頼ることはできません。 DBに。それで理想的には、時間の間に眠るいくつかの種類の長期的なプロセスを書く必要があります。

各オブジェクトがメモリから1回だけロードされるように、オブジェクトモデルを書きました。

編集:要件についての詳細

基本的には、複数の一致が同時に実行できる必要があります。これらの試合は任意の長さである可能性があるため、もう一方が始まる前に終了する必要はありません(実際には、ほとんどの場合、同時に実行されている複数の一致が発生する)。

私が想定しているのは、背景(サービス、私は思います、私は思いますか?)で実行され、60分間スリープしてからデータベースをチェックして、ゲームを開始するかどうかを確認します。起動する必要がある場合は、スレッドを消去してそれらのゲームをシミュレートしてから眠りに戻ります。したがって、シミュレーションスレッドは実行されていますが、「スケジューリング」スレッドはさらに60分間寝ています。

私ができない理由(私は思う)デフォルトのOSタスクスケジュールインタフェースを使用することは、これらが実行されるべきタスクが新しいプロセスとしてスパンされるようにする必要があることです。私は、最初のロード時に各オブジェクトクラスによってキャッシュされるような私のデータベースオブジェクトモデルを開発しました。つまり、各オブジェクトはメモリから1回ロードされ、その参照はすべての保存で使用されます。つまり、各シミュレーションスレッドがその状態で保存されると、状態を保存するために同じ参照が(更新された状態で)使用されます。異なる実行可能ファイルが毎回起動されると、おそらく異なるメモリ参照が各プロセスによって開かれ、したがって1つのプロセスがDBに保存され、他のプロセスによって書き込まれた状態を上書きすることができる。

サービスは行く方法のように見えます。サービスを60分間寝やり、その後に目覚めさせるだけで、サービスを目覚めさせる方法はありますか?これを標準のコンソールアプリケーションにメモリを浪費させることをお勧めしますが、私が知っていないものをする効率的な方法があるかどうかわかりません。

役に立ちましたか?

解決

本当に信頼できるようにしたい場合は、サービスをサービスにしてください。

しかし、私はそれを通常の(コンソール、winforms、wpf)アプリケーションにすることに問題はありません。

多分あなたは少し要件を拡大することができます。

他のヒント

私ができない理由(私は思う)デフォルトのOSタスクスケジュールインタフェースを使用することは、これらが実行されるべきタスクが新しいプロセスとしてスパンされるようにする必要があることです。私は、最初のロード時に各オブジェクトクラスによってキャッシュされるような私のデータベースオブジェクトモデルを開発しました(メモリリファレンス)とは、各オブジェクトは1回のメモリからのみロードされ、その参照はすべて保存

で使用されます。

あなたがすべてを永遠にキャッシュし続けることを望むならば、あなたは単に永遠に実行するアプリケーションを持つ必要があります。これをWindowsサービス、または通常のWindowsアプリケーションにすることができます。
Windowsサービスは、Service Manager APIに準拠した通常のEXEです。 1つを作成したい場合は、Visual Studioにはウィザードが表示されているため、Skeletonコードを自動生成します。基本的には、Mainメソッドを使用している代わりに、Serviceメソッドを備えたRunクラスがあり、他のすべてが同じです。

あなたが望んでいるならば、あなたの行動をスケジュールするためにWindowsタスクスケジューラを使うことができます。これを行う方法は、何もしないバックグラウンドで長時間のWindowsサービスを提供することです。 TCPソケットまたは名前付きパイプを開き、そこに座ってください。その後、このソケットまたは名前付きパイプに接続するだけの小さな「スタブ」EXEを書き、背景アプリに起動するように指示します。
これは、もちろん、バックグラウンドアプリケーションでsleepを実行するだけでなく、もっと難しいですが、それはあなたにもっと多くのコントロールを持つことができます - 背景サービスを再起動せずにスリープ時間を変更することもできます。


あなたのデザインを考えてみましょう。長期走行サービスに頼っているという事実は大きな障害点です。あなたのアプリが日々実行する必要があるならば、あなたはそれをクラッシュする単一のバグを持っているならば、あなたは再び始める必要があります。はるかに良いアーキテクチャはUNIXモデルに従うことです。これを開始し、その後終了したら(この場合はそれ自身のプロセスとしての各ゲームシミュレーションをプロセスとしてプロセスするので、それがマスタープロセスにしないようにしてください。または他のシミュレーションダウン)

あなたがそれを長期実行しようとしている主な理由のようですデータベースクエリをキャッシュすることです。あなたは実際にこれを全くこれをする必要がありますか?多くの時間データベースは十分に速くたくさんあります(彼らはそれぞれのキャッシュを持っています、それはたくさんのスマートです)。私がプログラマを見たことがある一般的な間違いは、データベースのようなものが遅いと仮定し、実際の事実に最適な時間の山を無駄にすることです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top