■31744 / ) |
DBデータ読み込み時のマルチスレッド処理について |
□投稿者/ pgm300 (3回)-(2009/01/28(Wed) 13:18:49)
|
分類:[C#]
2009/01/28(Wed) 13:20:06 編集(投稿者)
OS: Vista Business IDE:VS2008 言語:C# 形態:Windows Form
こんにちは。
マルチスレッドプログラミングについて質問させてください。
良くサンプルにあるSystem.ThreadingのThreadクラスを用いて、 DBからデータ読み込み中に、フォームのプログレスバーをインクリメント させて、処理しています(フリーズしていません)という感じにしたいのです。
コードとしては、Thread.Startを用いており、確かにスレッドは 出来ているが、当方の希望する動きになっていないのです。
具体的に言いますと、 処理として 1. ループとThread.Sleepを用いて、1秒おきにProgressバーの 値をインクリメントする処理。 2. DBからデータを読み込む処理
1と2は別スレッドになります。
2の処理は、DBからデータを読み込むのに、約30秒かかります。
処理の流れとしては、
@スレッド作成・開始 ADB読み込み ← System.Data.OracleClientを使用しています。 Bスレッド処理停止
となっていますが、各処理にConsole.WriteLineで処理開始・終了時刻を 出力するようにして、実際にデバッグすると、 希望としては
@00:00:00 A00:00:01 @00:00:01 @00:00:02 @00:00:03 @00:00:04 (省略) A00:00:30
というようにDB読み込み中にもスレッドが規則正しく動き、 プログレスバーのインクリメントを期待していたのですが、 実際には、
@00:00:00 A00:00:01 A00:00:30 @00:00:01 @00:00:02 @00:00:03 @00:00:04
というように、DB読み込みの処理に移ると、メッセージキューには 確かに書き込まれているようですが、DB読み込みが完了と同時に (上記の図でいくと、@の後ろ4つが) 一気にメッセージが処理されてしまうような動きになっています。
ですので、はじめの1回目のインクリメントはされて、プログレスバーに 表示されますが、その後はDB読み込み完了後に、一気にインクリメント され、全然意味のないプログレスバーになってしまっています。
この状態を回避したいと考えておりますが、ご存じの方がおられましたら、 相談に乗って頂けないでしょうか?
宜しくお願い致します。
|
|