|
■No13771 (natural さん) に返信 >>スレッドをどのようにするのかはいろいろ考慮する必要があると思います。 > 2つの処理を、それぞれ1スレッドずつのみ動作するように作成しようと思っています。 > (1日〜数日に一回ずつしか動作しないものなので、動作がかぶることはないと思うのですが) > 例えばCSVを読み込んでDBへ・・・と動作しているうちに次のCSV読み込み動作が始まって・・・ > とマルチスレッドで処理できるほど、私の頭は賢くできていない(理解できていない)ためです。 > それぞれ1スレッドで動作し、2つの処理は同じ変数を参照・変更しないのであれば、 > 特に難しい問題はないと思っているのですが、いかがでしょうか?
スレッドを分けるかどうかはどのくらい重い処理なのかなどに依ります。 今回は簡単な処理にみえますから、 ワーカースレッドなど作らなくてもTimerCallbackを実行するスレッドで実行すればいいと思います。
また、動作が被ることは考えづらくても、私なら排他処理はしておきます。 何かの都合で処理が詰まっちゃったときなどに困ります。
被る可能性が低いなら、排他の粒度をあげてもいいので簡単です。 例えば、あるメソッド全体を排他的にするなら
private Int32 exclusiveflag = 0; private void method1() { if (InterLocked.CompareExchange(ref exclusiveflag, 1, 0) != 0) return; try { //処理をここに。 } finally { InterLocked.Exchange(ref exclusiveflag, 0); } } という感じにすればよく、 今回は処理ごとにメソッドを用意してそれを排他的にすればいいので かなり簡単です。
> 今回は、上司よりWindowsサービスで設計するよう指示がでているため、 > なんとかWindowsサービスで・・・と思っているのですが、
サービスでもタスクマネージャでも十分に要望は満たせますし、それほど手間も変わりません。 「タスクマネージャに登録するアプリ」と「実際に処理をするアプリ」の二つを作るのはめんどくさいので 私ならサービスにするかな。
|