タイトル : 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 の内容を確認するようにしてください。 |