- PR -

サービスアプリケーションの実行

投稿者投稿内容
MyHandle
常連さん
会議室デビュー日: 2007/04/15
投稿数: 39
投稿日時: 2007-11-02 11:37
サービスアプリケーションの実行について

FrameWork V2.0.50727 環境

OnStart内で、実行するメソッド(仮にMyMethod)を呼んでいます。
MyMethod内では、実際に実行するクラス(仮にMyClass)内の処理を
MyMethod内の無限ループで実行しています。

動作が重いので、次に、MyMethod内の無限ループをやめて MyClassの処理をBackgroundWorkerで行うように変更してみました。この中で無限ループ内で
実際の処理を行っています。
実行してみたところ、体感だけですが、さほどパフォーマンスは変わらない
ように思いました。しかも両方ともタスクマネージャで見るとCPU使用率が
高いです。
サービスが開始されているときは、MyClassはexeファイルとしてプロセスが
起動しています。
まったく知りえないところで間違っているのかもしれませんが、パフォーマンスを
あげてサービスを稼動させるにはどうしたらいいでしょうか?




Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2007-11-02 12:13
Thread.Sleep()でウェイトを入れてみてはどうでしょう。
MyHandle
常連さん
会議室デビュー日: 2007/04/15
投稿数: 39
投稿日時: 2007-11-02 13:09
引用:

Anthyhimeさんの書き込み (2007-11-02 12:13) より:
Thread.Sleep()でウェイトを入れてみてはどうでしょう。



無限ループ内でThread.Sleep()でしょうか?
このループ内の処理はサービス起動中は常に行わなくてはならず(処理と処理の間隔が
短いほうが望ましい)
Thread.Sleep() 100ms単位でループ開始時に入れてみました。(100ms,200ms,300ms)
が、体感では変わりませんでした。

他になにかパフォーマンスの悪さ、CPU使用率の高さに原因があるのでしょうか?
そもそもサービスを起動実行するとき、BackgroundWorkerは使ったほうがよいのでしょうか?使うべきではないのでしょうか?それとも他になにか方法があるのでしょうか?サービスなので意識しないところで動きつづけていてほしい(今の場合ループで処理をし続ける)のですが今は実現できていません。



[ メッセージ編集済み 編集者: MyHandle 編集日時 2007-11-02 13:21 ]
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2007-11-02 15:54
ちなみに処理の内容は何でしょうか。
MyHandle
常連さん
会議室デビュー日: 2007/04/15
投稿数: 39
投稿日時: 2007-11-02 17:37
引用:

Anthyhimeさんの書き込み (2007-11-02 15:54) より:
ちなみに処理の内容は何でしょうか。



0 初期処理
1 あるコントロールのイベントを待つ
2 一定時間にイベントがない場合は用意された処理を行う
  あった場合は、なにもせず1へ
1,2の繰り返しです。

あいまいな表現で申し訳ありません。
サービスアプリケーションでなければこのコントロールはformで定義していましたが
今はフォームではなくクラスファイルにしてサービススタート時にwitheventで追加
しています。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-11-02 18:20
引用:

MyHandleさんの書き込み (2007-11-02 13:09) より:
Thread.Sleep() 100ms単位でループ開始時に入れてみました。(100ms,200ms,300ms)
が、体感では変わりませんでした。


「体感」とは具体的にはどうやって計るのでしょうか?
また、CPU使用率は、単純に言えば、その処理1回にかかる時間を a [ms], その処理ごとにはさむ Sleep を b[ms] とすれば、a ÷ (a + b) になるはずです。「体感」で変わらないとすれば、その処理1回にかかる時間が 300[ms] よりもはるかに長いことが予想されます。(あるいは「体感」が正しく計測できていない。)
ならば、Sleep を長く10秒〜100秒くらいにすれば良いのでしょうが、そうすると、おそらく、おっしゃるような「処理と処理の間隔が短いほうが望ましい」を満たせなくなるでしょう。

結局、ポーリングの頻度をどうするか、や、そもそもポーリングで実現できることなのか(イベントを使わないといけないのではないか)、という問題です。

引用:

MyHandleさんの書き込み (2007-11-02 13:09) より:
他になにかパフォーマンスの悪さ、CPU使用率の高さに原因があるのでしょうか?
そもそもサービスを起動実行するとき、BackgroundWorkerは使ったほうがよいのでしょうか?使うべきではないのでしょうか?それとも他になにか方法があるのでしょうか?サービスなので意識しないところで動きつづけていてほしい(今の場合ループで処理をし続ける)のですが今は実現できていません。


BackgroundWorker は使ったことがないので良くは知らないのですが、おそらく使っても使わなくても特に違いはないと思います。
しいていえば、そのループのプロセスやスレッドの優先度を下げることで、「体感」の重さは下げることができるかもしれません。しかし、これはあまり根本的な解決ではありません。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
MyHandle
常連さん
会議室デビュー日: 2007/04/15
投稿数: 39
投稿日時: 2007-11-02 20:05
引用:

結局、ポーリングの頻度をどうするか、や、そもそもポーリングで実現できることなのか(イベントを使わないといけないのではないか)、という問題です。





先述のとおりイベントを待っています。イベントはほぼ決まった時間間隔で発生し
このイベントの結果をみて特定の処理をするorしないを繰り返し監視しているような
状態です。
サービスを起動した際に、onStartでスレッドは作成しているので、
プロセスとかスレッドとかBackgroundWorkerとかに、起動から実行中のパフォーマンス
はあまり関係がないのでしょうか?
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-11-02 20:33
引用:

MyHandleさんの書き込み (2007-11-02 20:05) より:
引用:

結局、ポーリングの頻度をどうするか、や、そもそもポーリングで実現できることなのか(イベントを使わないといけないのではないか)、という問題です。





先述のとおりイベントを待っています。イベントはほぼ決まった時間間隔で発生し
このイベントの結果をみて特定の処理をするorしないを繰り返し監視しているような
状態です。


私は、なんらかのイベントは待つが、その結果により、ポーリングする処理(これはイベントを使わない)をしている、ということかと解釈していました。
だから、もしポーリングをやめてイベントを使うとしたら、イベントAを待って、その結果により、イベントBを待つ処理を動かすことになるのかと思っていました。

引用:

MyHandleさんの書き込み (2007-11-02 20:05) より:
サービスを起動した際に、onStartでスレッドは作成しているので、
プロセスとかスレッドとかBackgroundWorkerとかに、起動から実行中のパフォーマンス
はあまり関係がないのでしょうか?


この問題は、サービスにした場合だけ起こる問題なのでしょうか?
(私の今までの回答は、サービスに依存しないものだと勝手に仮定して書いていました。)

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}

スキルアップ/キャリアアップ(JOB@IT)