0

いくつwin formかのデータをロードし、gridviewスレッドを使用して埋めるアプリケーションがあります。ここでは、グリッドを埋めるタスクにほとんど時間がかからないため、現時点では別のスレッドを使用してデータを埋めるタスクを実行しています。したがって、現在発生しているのは、ウィンドウフォームが最初にグリッドを使用していくつかの情報をロードし、その後、ユーザーが応答性の高い UI を使用している間にグリッドにデータを入力することです。

フォームロードで

DataBind();
var newThread = new Thread(new ThreadStart(FillGrid));
newThread.Start();

このFillGrid()メソッドは、各行とすべての列を処理し、値に応じてセルの色を変更し、いくつかのデータを追加します。私が達成しようとしているのは、空のデータでフォームをロードするのではなく、グリッドの半分のように入力し、フォームがロードされた後に残りのグリッドを入力し続けることです。Thread.Sleep()に電話してから試してみましたnewThread.Start()が、期待したとおりに動作しませんでした。

これを達成するための助け!!!

安全にアクセスするには、更新の種類ごとにデリゲートを作成せずに別のスレッドからフォームを更新するgridview方法に関するこの記事を参照してください。

ありがとう

4

5 に答える 5

1

すでに述べたように、BackgroundWorker.ReportProgress を使用します。ただし、途中で送り返したオブジェクトを更新し続ける必要はありません (2 番目のリンクを参照)。

そうは言っても、グリッドがゆっくりといっぱいになる原因を見てください。データの 1/2 を送り返すことは、少しだけ役に立ちます。データの 1/2 をロードするだけで、実際にどのくらいの時間を節約できますか? UI の更新が 2 回あるため、合計時間が長くなります。

ここにリンクの説明を入力

ここにリンクの説明を入力

于 2012-07-17T12:59:46.010 に答える
0

これは、バックグラウンドワーカーを使用した非常に簡単な例です。それがあなたを正しい方向に向けてくれることを願っています。

Me.Invoke()メソッドを使用してUIを更新した方法に注意してください。すべてのUI要素は、それらを作成したスレッドから更新する必要があるため、これが必要です。

Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        BackgroundWorker1.RunWorkerAsync()
    End Sub

    Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim r As New Random()
        For index As Integer = 0 To 100
            Me.Invoke(Sub()
                          ListBox1.Items.Add(Guid.NewGuid().ToString())
                      End Sub)
            Threading.Thread.Sleep(r.Next(50, 300))
        Next
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        Me.Invoke(Sub()
                      MsgBox("Task Complete", MsgBoxStyle.OkOnly, "Task Complete")
                  End Sub)
    End Sub
End Class
于 2012-07-17T14:06:44.467 に答える
0

バックグラウンド スレッドでは、グリッドに触れないでください。代わりに、それを使用して、グリッドにバインドされていないコレクションにデータを埋めてください。

タイマーを作成し、そのイベントで、バックグラウンド スレッドで満たされたコレクションから GUI にデータを PULL します。

そうすれば、Invoke や、非 GUI スレッドから GUI と対話するときに発生するあらゆる種類の問題について心配する必要がなくなります。

于 2012-07-17T13:05:02.810 に答える
0

AutoResetEvent を使用します - メインスレッドを待機させ、グリッドが半分満たされたときに; メインスレッドに続行するように通知します..

http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx

于 2012-07-17T09:09:57.340 に答える
0

データの読み取り中にグリッドを埋める必要があります。セカンダリ スレッドでデータを読み取り、グリッドに入力する準備ができたデータのチャンクがあるときに UI スレッドに通知します。UI をメイン スレッドから更新する必要があるため、スレッド ジャグリングを少し行う必要がありますが、それほど難しくはありません。

を使用してBackgroundWorker、そのProgressChangedイベントでグリッドを更新することもできます。

于 2012-07-17T09:10:02.977 に答える