- - PR -
サービスアプリケーションの実行
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-11-02 11:37
サービスアプリケーションの実行について
FrameWork V2.0.50727 環境 OnStart内で、実行するメソッド(仮にMyMethod)を呼んでいます。 MyMethod内では、実際に実行するクラス(仮にMyClass)内の処理を MyMethod内の無限ループで実行しています。 動作が重いので、次に、MyMethod内の無限ループをやめて MyClassの処理をBackgroundWorkerで行うように変更してみました。この中で無限ループ内で 実際の処理を行っています。 実行してみたところ、体感だけですが、さほどパフォーマンスは変わらない ように思いました。しかも両方ともタスクマネージャで見るとCPU使用率が 高いです。 サービスが開始されているときは、MyClassはexeファイルとしてプロセスが 起動しています。 まったく知りえないところで間違っているのかもしれませんが、パフォーマンスを あげてサービスを稼動させるにはどうしたらいいでしょうか? | ||||||||||||
|
投稿日時: 2007-11-02 12:13
Thread.Sleep()でウェイトを入れてみてはどうでしょう。
| ||||||||||||
|
投稿日時: 2007-11-02 13:09
無限ループ内でThread.Sleep()でしょうか? このループ内の処理はサービス起動中は常に行わなくてはならず(処理と処理の間隔が 短いほうが望ましい) Thread.Sleep() 100ms単位でループ開始時に入れてみました。(100ms,200ms,300ms) が、体感では変わりませんでした。 他になにかパフォーマンスの悪さ、CPU使用率の高さに原因があるのでしょうか? そもそもサービスを起動実行するとき、BackgroundWorkerは使ったほうがよいのでしょうか?使うべきではないのでしょうか?それとも他になにか方法があるのでしょうか?サービスなので意識しないところで動きつづけていてほしい(今の場合ループで処理をし続ける)のですが今は実現できていません。 [ メッセージ編集済み 編集者: MyHandle 編集日時 2007-11-02 13:21 ] | ||||||||||||
|
投稿日時: 2007-11-02 15:54
ちなみに処理の内容は何でしょうか。
| ||||||||||||
|
投稿日時: 2007-11-02 17:37
0 初期処理 1 あるコントロールのイベントを待つ 2 一定時間にイベントがない場合は用意された処理を行う あった場合は、なにもせず1へ 1,2の繰り返しです。 あいまいな表現で申し訳ありません。 サービスアプリケーションでなければこのコントロールはformで定義していましたが 今はフォームではなくクラスファイルにしてサービススタート時にwitheventで追加 しています。 | ||||||||||||
|
投稿日時: 2007-11-02 18:20
「体感」とは具体的にはどうやって計るのでしょうか? また、CPU使用率は、単純に言えば、その処理1回にかかる時間を a [ms], その処理ごとにはさむ Sleep を b[ms] とすれば、a ÷ (a + b) になるはずです。「体感」で変わらないとすれば、その処理1回にかかる時間が 300[ms] よりもはるかに長いことが予想されます。(あるいは「体感」が正しく計測できていない。) ならば、Sleep を長く10秒〜100秒くらいにすれば良いのでしょうが、そうすると、おそらく、おっしゃるような「処理と処理の間隔が短いほうが望ましい」を満たせなくなるでしょう。 結局、ポーリングの頻度をどうするか、や、そもそもポーリングで実現できることなのか(イベントを使わないといけないのではないか)、という問題です。
BackgroundWorker は使ったことがないので良くは知らないのですが、おそらく使っても使わなくても特に違いはないと思います。 しいていえば、そのループのプロセスやスレッドの優先度を下げることで、「体感」の重さは下げることができるかもしれません。しかし、これはあまり根本的な解決ではありません。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||||||
|
投稿日時: 2007-11-02 20:05
先述のとおりイベントを待っています。イベントはほぼ決まった時間間隔で発生し このイベントの結果をみて特定の処理をするorしないを繰り返し監視しているような 状態です。 サービスを起動した際に、onStartでスレッドは作成しているので、 プロセスとかスレッドとかBackgroundWorkerとかに、起動から実行中のパフォーマンス はあまり関係がないのでしょうか? | ||||||||||||
|
投稿日時: 2007-11-02 20:33
私は、なんらかのイベントは待つが、その結果により、ポーリングする処理(これはイベントを使わない)をしている、ということかと解釈していました。 だから、もしポーリングをやめてイベントを使うとしたら、イベントAを待って、その結果により、イベントBを待つ処理を動かすことになるのかと思っていました。
この問題は、サービスにした場合だけ起こる問題なのでしょうか? (私の今までの回答は、サービスに依存しないものだと勝手に仮定して書いていました。) -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} |