■9689 / ) |
Re[9]: System.Timers.Timerでのイベント処理 |
□投稿者/ nbmyou (48回)-(2007/11/02(Fri) 11:19:49)
|
2007/11/02(Fri) 11:44:48 編集(投稿者)
■No9663 (れい さん) に返信 ■No9656 (mあ@反省中 さん) に返信
丁寧な回答どうもありがとうございます。 お二方への同時返信である旨、失礼かとは思いますがご容赦願います。
> でもスレ主さんは理解できたのかな?
すみません。正直、半分も理解できていないと思います。 そこで、数点質問させていただけますでしょうか。
質問の前に念のため、作成しようとしている監視の内容について概要をお伝えいたします。 ●DBが動作しているサーバ上で動くサービス。 ●監視は数分おきのポーリングで行う。 ●監視フォルダにXMLファイルが存在する場合、以下の処理を行う。 ・バックアップ用フォルダへのコピー ・XMLファイルの読み取り ・読み取ったデータのDB登録 ・監視フォルダ内の処理済XMLファイルを削除 大雑把にこんな感じのものです。
次に質問の内容ですが、
@ 上記に示したような内容の処理内容なので、重くてもスピード重視というよりは、 基本的に軽く動作するように実装したく思っております。それであれば、 > シングルスレッド同期ファイルアクセスが最高であろうと思われます。 > 速度が足りないときはファイルアクセスを非同期にして増やすのがいいでしょう。 ということで、変わりありませんでしょうか。
A 無知で申し訳ないのですが、「ワーカースレッド」とは、 「作業を行うスレッド」というような意味合いで間違いありませんでしょうか。 それとも、何か実装方法など、特別な方法をとったもののことなのでしょうか。 googleで検索をかけてみると、この言葉はたくさんひっかかってくるのですが、 「ワーカースレッド」そのものに対する説明を見つけられず、意味を正確に理解することができておりません。 お手数ですが、教えていただけると助かります。
A System.Windows.Forms.Timerは使わないべきである点は理解できました。 そこで、れいさんが説明してくださった内容についてなのですが
> 監視をシングルスレッドでやるなら、 > ワーカースレッドで時刻を監視して、 > 定期的に処理するのが一番楽で軽いですね。 > Sleepは重くないですし、それほどいい加減でもないので。 > > System.Timers.Timerを使いたいなら、 > シングルスレッド化しないといけません。 > ロックオブジェクトをいれてクリティカルセクションを構成したり、 > 専用のワーカースレッドを用意し、 > Timerイベントからワーカースレッドへ、 > イベントを通知するのが普通かと思います。
上記の内容は、 ・System.Timers.Timerを使用する。 ・Sleepを使用する。(Thread.Sleepをタイマー代わりに使用するということでしょうか?) という2択を示してくださった、という認識で間違いありませんでしょうか。 また、「ロックオブジェクト」「クリティカルセクション」についても(言葉の意味から)理解できていないのですが 下のCで説明してくださっている内容に含まれている意味のものでしょうか。
C > 再入フラグ用integer or booleanを一個用意。 > Timerイベント先頭でInterlockedクラスを用いてinteger型をチェック。 > 再入してるなら何もせずに帰る。 > 再入してないなら監視タスクを実行。 > 監視タスクが終わったら再入フラグをクリア。 > > もしくは。 > > AutoResetEventを用意。 > TimerイベントではEventをセットするだけ。 > ワーカースレッドはEventを待つ。 > イベントが通知されたら監視タスクを実行。 > 監視タスクが終わったらまたAutoResetEventを待つ。
上記のどちらかの方法をお勧めしてくださっているのですよね? AutoResetEventクラスという、「イベントが発生したことを待機中のスレッドに通知」するクラスがあるということを、 今回始めて知りました。情報ありがとうございます。 これら上記どちらの方法を使用しても、同じ処理(タイマイベントで処理実行時、次のタイマイベントが発生しても、後のイベントは何もしない)を 行うことができるという認識で間違いありませんでしょうか。
4点も申し訳ありません。。。 さしあたって質問させていただきましたが、 回答を待つ間、自分でも再度いろいろ調べたり、テスト実装してみて勉強してみようと思います。
お手数ですが、回答いただけるととても助かります。 よろしくお願いいたします。
|
|