tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^3: 抽出クエリを非同期で実行し、 DataSet に入れる方法
投稿日: 2007/08/02(Thu) 19:25
投稿者魔界の仮面弁士
>     Do
>         Application.DoEvents()
>     Loop While isComplete = False
このような待機処理は、基本的に行わないでください。

RunWorkerAsync 発行後、完了を待つために「ループで待機する」のではなく、
完了後に呼び出される「RunWorkerCompleted イベント」で事後の処理を行うようにします。


>     ' 抽出クエリの実行
>     adapter.Fill(ds)               '<--- ここ
DoWork イベントでの処理中には、(isComplete や ds などの)フォーム変数や
コントロールなどを操作してはいけません。
基本的には、すべてイベント内の変数だけで完結させるようにし、
進捗状況や結果などは、引数で受け渡すようにします。


概念的には、こんな感じ。

'<呼び出し>
Sub Button1_Click(・・・
   '引数情報。テーブル名でも接続文字列でもお好きなものを入れておきましょう。
  Dim arg As Object = 任意の値

  Label1.Text = "検索中"

  '非同期処理を開始するように指示するメソッド。
  BackgroundWorker1.RunWorkerAsync(arg)
End Sub

'<非同期で処理>
Sub BackgroundWorker1_DoWork(・・・
  '引数情報を受け取る。この値は好きなように使ってください。
  Dim arg As Object = e.Argument

  '*** 長い処理をここで実行 ***
  Dim dataSet As New Dataset()
  Using connection As New ・・・
   Using adapter As New ・・・
    adapter.Fill(dataSet)
     End Using
   connection.Close()
  End Using

  '処理結果を Result に代入する。(この場合は DataSet)
  e.Result = dataSet
End Sub

'<処理が終わった時に呼ばれるイベント>
Sub BackgroundWorker1_RunWorkerCompleted(・・・
  '処理結果を受け取る。(この場合は DataSet)
  ds = DirectCast(e.Result, DataSet)

  '*** 必要であれば、受け取ったデータの表示処理などをここに記述
  '(砂時計カーソルを使っていたら、それを戻したりとか)
  Label1.Text = "検索完了"
End Sub


# 実際には、RunWorkerCompleted で e.Result を受け取る前に、
# e.Cancelled や e.Error の内容を確認するようにしてください。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。