0

私は何百万ものレコードを徹底的に計算するプログラムを持っています。場合によっては、1時間以上、場合によっては約30分実行されます。その間、プログラムは応答しないか、クリックできません。これに対する回避策はありますか?同様に、読み込み中のマウスアイコン。

もう1つの問題は、データグリッドのデータソースとして2つの辞書を作成すると、csvファイルを読み取ってデータグリッドに挿入する場合に比べて非常に遅いことです。これがアルゴです:

for i = 0 to last record
    datarow row = new datarow
    put i to row[0]
    put names[i] to row[1]
    put comments[i] to row[2]
    add row to datatable
end for loop
datatable.acceptchanges()
datagridview.datasource = datatable

注:names[i]とcomments[i]は辞書です。ただし、ほぼ同じループでcsvファイルを読み取り、それをdatatableに入れて、datagridviewのデータソースとして作成すると、高速になります(20分の辞書と比較して約5〜10分)。そのための回避策はありますか?

4

4 に答える 4

3

あなたがしなければならないのは、UIスレッド以外のスレッドで長時間実行されるプロセスを実行するために少しのマルチスレッドを使用することです:

var task = new Task(() =>
{
    // do some work to get your dataTable
    dataTable.AcceptChanges();
    datagridview
        .Invoke(new Action(() => datagridview.DataSource = dataTable));
});

task.Start();
于 2012-04-27T00:59:14.143 に答える
1

.NET 4を使用していると仮定して、Taskクラスを使用します。GUIの応答性を維持しながら、バックグラウンドスレッドでジョブを実行します。

.NET 4を使用していない場合でも、単純なマルチスレッドクラスを利用できます。私はおそらくを使用しますBackgroundWorker

于 2012-04-27T00:59:18.567 に答える
0

これを試して:

var taskA = new Task(() => {
 for i = 0 to last record
    datarow row = new datarow
    put i to row[0]
    put names[i] to row[1]
    put comments[i] to row[2]
    add row to datatable
 end for loop
 datatable.acceptchanges()
 datagridview.datasource = datatable
});

// Start the task.
taskA.Start();

タスクについてもっと見る

于 2012-04-27T01:01:23.330 に答える
0

これをバックグラウンドで実行するタスクを使用します。そうすれば、タスクの実行中にUIスレッドがロックされなくなります。

 var task = new Task(() =>
 {
  for i = 0 to last record
     datarow row = new datarow
     put i to row[0]
     put names[i] to row[1]
     put comments[i] to row[2]
     add row to datatable
  end for loop
  datatable.acceptchanges()
 });

 // Start the task.
 task.Start();

 task.ContinueWith(t =>
 {
    datagridview.datasource = datatable
 }, TaskScheduler.FromCurrentSynchronizationContext());

UIスレッドでデータソースを割り当てる必要があります。そうしないと、例外が発生します。これが、TaskSchedulerビットが行うことです。タスクが完了すると、継続はUIスレッドで実行されます(UIスレッドから継続を設定したと仮定します)。

于 2012-04-27T01:09:39.380 に答える