DOBON.NET DOBON.NETプログラミング掲示板過去ログ

別スレッドでの実行について質問です

環境/言語:[WindowsXP,C#,Framework 3.5]
分類:[.NET]

こんにちは。

さて、現在、画面にボタンが複数個配置してあり
その中の1つのボタンを押下すると、DBの内容を
変数へ取り込むという機能があります。

この処理が5秒くらいかかるので、この間に他のボタンを
押下することが出来ず、別の処理を実行できません。

そこで、上記機能を別スレッドで実行してみようと思い、
下記のようなプログラムの変更を行ったのですが、やはり
現象は同じでした。

やりたい事は、ボタン押下でDBの内容を取り込んでいる
間に別のボタンを押して他の処理を実行できないかという事です。

記述に問題があるのでしょうか?
分かる方がおられましたら教えていただけないでしょうか?


【変更前】
private void btnxxx_Click(object sender, EventArgs e)
{
  if (classA.Init() == false)
  {
    MessageBox.Show("ERROR!");
  }
}

【変更後】
private void btnComData_Click(object sender, EventArgs e)
{
  Thread t = new Thread(new ThreadStart(worker));
  t.Start();
}


delegate void SetKoshinDelegate();

private void Kousin()
{
  if (classA.Init() == false)
  {
    MessageBox.Show("ERROR!");
  }
}

private void worker()
{
  Invoke(new SetKoshinDelegate(Kousin));
}
■No23366に返信(KUROBOUさんの記事)
> この処理が5秒くらいかかるので、この間に他のボタンを
> 押下することが出来ず、別の処理を実行できません。

そういう時には BackgroundWorker を使いましょう。
概要としては、こんな感じ。



呼び出し処理(DB取込ボタン):button1_Click
 object obj = 任意の引数;  // 検索条件など
 this.backgroundWorker1.RunWorkerAsync(obj);


時間のかかる部分(実際の取り込み処理):backgroundWorker1_DoWork
 object obj = e.Argument;
 /*
 ** ここに 時間のかかる処理を記述
 **/
  e.Result = 処理結果;  // DataSet など


処理完了通知イベント:backgroundWorker1_RunWorkerCompleted
 if (e.Error != null)
 {
  object result = e.Result;  // 処理結果
  MessageBox.Show("取り込み完了");
 }
 else
 {
  MessageBox.Show(e.Error.Message);
 }
> 【変更後】
> private void btnComData_Click(object sender, EventArgs e)
> {
>   Thread t = new Thread(new ThreadStart(worker));
>   t.Start();
> }
>
> private void worker()
> {
>   Invoke(new SetKoshinDelegate(Kousin));
> }

Invokeメソッドの効果を調べてください。
現状は、Threadクラスを作って、別スレッドを立ち上げたものの、Invokeメソッドで元のスレッドで処理しろと命令しているので、画面は固まってしまいます。

基本方針として、必要なとき以外はInvokeメソッドを呼ばないようにして下さい。
例えば、処理の途中経過を定期的に更新するといった程度の頻度であれば、Invokeメソッドを呼んでも良いかと思いますが、処理の大半をInvoke先でやるのであれば、スレッドを分ける意味がなくなります。(作ったスレッドが機能せずに元のスレッドで処理が終わるのを待つ時間が長くなる)


まずは、Invokeメソッドの効果を知り、どの部分がメインスレッド(元のスレッド)で実行しなければならないか、どの部分が別スレッド(作ったスレッド)で実行して問題ないか、見当をつけて下さい。
魔界の仮面弁士 さま
Azulean さま

自分が思った動作はできました。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板