3

私は現在、いくつかの「強力な」クエリを実行するプログラムを持っています。テキストボックスを追加し、クエリの開始時、編集中、および残りのステータスの更新を表示しました。これは私のニーズに合っていますが、すべてのクエリが完了するまで、テキストボックスには実際には何も表示されません。次に、すべての更新を一度に表示します。別のスレッドでテキストボックスを更新することでこの問題が解決すると思いますが、そこで迷子になります。クエリを実行しているメインフォームからメッセージを受信するスレッドを使用して、テキストボックスに表示させるにはどうすればよいですか?

4

4 に答える 4

8

BackgroundWorkerコンポーネントはニーズに合っています(サンプルコードはMSDNリンクにあります)。そのイベントを処理し、そのDoWork中で実際のクエリを実行します。メソッドを呼び出して進行状況を報告しReportProgressます。報告された進行状況を表示するには、そのProgressChangedイベントを処理してUIを更新する必要があります。RunWorkerAsyncバックグラウンドワーカーのメソッドを呼び出してジョブを開始します。を使用BackgroundWorkerすると、スレッドを手動で開始および停止したり、UIスレッドと通信してプログレスバーを更新したりする必要がなくなります。

于 2010-01-25T21:12:39.450 に答える
3

BackgroundWorkerは、バックグラウンドスレッドで集中的な作業を行うための優れた汎用メソッドです。ただし、質問はデータベース操作を行っているように聞こえるので、ADO.Netで非同期操作のネイティブサポートを使用する方が簡単な場合があります。プログレスバーにコールバックを使用できます。

于 2010-01-26T10:26:26.520 に答える
1

これを行う最も簡単な方法は、BackgroundWorkerを利用して、そのDoWorkイベントを処理し、ProgressChangedイベントを使用して進行状況をProgressBarに報告することです。

始めること:

worker.RunAsync()

進捗状況の報告:

worker.ReportProgress(10) 'for 10%
于 2010-01-25T21:14:58.520 に答える
1

MehrdadとAlexが投稿した内容に加えて、ReportProgessメソッド(ProgressChanged)によって発生したイベントを処理してプログレスバーを更新する方法は次のとおりです。

Private Sub backgroundWorker_ProgressChanged ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Handles backgroundWorker.ProgressChanged

    Me.progressBar1.Value = e.ProgressPercentage

End Sub
于 2010-01-25T21:18:20.103 に答える