2

私はここで大規模なderpの瞬間を過ごしていることを知っています、そしてこれはおそらく実際に行うのは非常に簡単です-私は周りを検索していくつかの記事を読みましたが、まだ少し苦労しているので、フィードバックや有用なリソースへのポインタは大歓迎です!

PopulateDatagridViewsとにかく、私はさまざまな関数を持っているというクラスを持っていますが、そのうちの1つはと呼ばれExecuteSqlStatementています。この関数は十分に単純で、SQL接続を初期化しDataTable、SQLクエリの結果を入力して返します。同じクラス内に、文字列ビルダーを使用してSQLステートメントを作成するさまざまな関数もあります。(理想的ではありません、私は知っています。)

GUIスレッドでオブジェクトを作成し、PopulateDatagridViewsそれを使用して、返されたでさまざまなデータグリッドビューを設定しますDataTables。例えば:

dataGridViewVar.DataSource = populateDgv.GetCustomers();

当然のことながら、私が抱えている問題は、データベースから読み取るデータが多いほど、UIが応答しなくなる時間が長くなることです。を介してデータを取得するプロセスをPopulateDatagridViews別のスレッドにシフトするかBackgroundWorker、これが処理されている間にメインGUIスレッドがロックされないようにします。

BackgroundWorkerこれを行うためのを作成し、DoWorkハンドラーに自分の内の適切な関数への呼び出しを配置できることに気付きましたPopulateDatagridViews

BackgroundWorkerクラス内の個々の関数ごとにを作成できると思いますPopulateDatagridViewsが、これを行うためのより効率的な方法は確かにありますか?それが私を曲がり角の周りに駆り立てているので、これに関する正しい方向のポイントに非常に感謝します!

追加情報:バージョン4.0の.Netフレームワークを使用しています。

4

2 に答える 2

1

TPL(タスク並列ライブラリ) http://msdn.microsoft.com/en-us/library/dd537609.aspxを使用することを強くお勧めします。 この場合、最初のタスクを作成してデータをプルし、最初に2番目のタスクを開始します。 UIを更新するために完了しました。同様の問題のために書いたコードを見つけようとします。

編集:コードの追加

Task<return_type> t1 = new Task<return_type>(() =>
            {
                //do something to take some result
                return some_result; //return it
            });
            t1.Start();
            Task t2 = t1.ContinueWith((some_arg_that_represent_previous_task_obj) =>{//ContinueWith guarantees that t2 is started AFTER t1 is executed!                

                //Update your GUI here
                //if you need result from previos task:   some_arg_that_represent_previous_task_obj.Result   //Your dataset or whatever

            }, TaskScheduler.FromCurrentSynchronizationContext());  //VERY important - you must update gui from same thread that created it! (you will have cross thread exeption if you dont add TaskScheduler.FromCurrentSynchronizationContext()

それが役に立てば幸い。

于 2012-12-10T15:48:34.927 に答える
1

その場合は、このmsdnの記事を読んでアイデアを得るのをお勧めします。その後、msdnは物事を学ぶのに最適なソースではないため、いくつかのチュートリアルを探す必要があります。; o)

于 2012-12-10T15:49:39.873 に答える