- - PR -
ReleaseでビルドしたexeだとWindowsサービスが終了しない
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2005-05-17 21:51
なちゃさん、Jittaさん、レスありがとうございます。
今回の件については、サービス停止しない限り複数スレッド(サービス本体とタイマ)の処理が重なることは無いはずですのでまだ良いのですが、マルチスレッドを甘く見てました・・・。 漫画書いて整理してみます。 | ||||
|
投稿日時: 2005-05-18 08:40
マルチスレッドのバグって見つけにくい、直しにくいっていうたちの悪いバグの場合が多いんですよ、経験上。再現性がないのが普通だったりしますしね。 なので、コード書くときは本気で慎重に書いてください。ServiceBaseにはISynchronizeInvokeとかが実装されてないので、Frameworkからの助けは一切ありません。複雑なら作るという手もありますけども。 今回の場合は、Serviceということもあってちょっとすぐにはこれだってコードは難しいです。簡単な修正ならば、メンバに触っている部分をlock(this)で囲むっていう方法もあります。 ただ、処理部分を単一スレッドに分割したりとか色々と方法はありますし、どっちにしろ仕様とかも含めて煮詰める必要があると思います。 [ メッセージ編集済み 編集者: ya 編集日時 2005-05-18 08:42 ] | ||||
|
投稿日時: 2005-05-18 21:20
私が初めて…ん?今のところ最初で最後かも?…マルチスレッドで、かつすべてのスレッドが単一のオブジェクトを操作しなければならないコードを書いたとき、フローチャートを描いて、マルチスレッドになるところ、単一オブジェクトを操作するところをマークしました。
その後、マルチスレッドになる箇所ができるだけ短くできないか、検討しました。 その検討の後、単一オブジェクトを操作する箇所が、フロー上に分散しないように、検討しました。 …逆のような気がする… 単一オブジェクトを操作する箇所は、ロックして単一スレッドからのみ参照されるように設計します。そのロックの範囲は「短く、少なく」が基本です。 そう言えば、リリース後のバグが1件という、私にとってはとても優秀なプロジェクトでした。システムの寿命も短かったけど... _________________ | ||||
