2

3000 を超える多くの項目を入力する ListView があります。これには最大 15 秒かかる場合があります。アイテムを追加するたびに、これまでに追加されたアイテムの数を示すラベルを更新したいと考えています。そのために、次のコードを使用します。

foreach (FileInfo f in dir.GetFiles("*.*", SearchOption.AllDirectories))
{
    DateTime dt = GetDateTakenFromImage(Path.Combine(f.Directory.ToString(), f.Name));
    count++;
    labelLoadedLeft.Text = "Loading " + count + " files so far";
    ListViewItem lSingleItem = lv.Items.Add(f.Name);

    lSingleItem.SubItems.Add(dt.ToString("dd MMMM yyyy"));
    lSingleItem.Tag = Path.Combine(f.Directory.ToString(), f.Name);
}

残念ながら、すべてのアイテムが読み込まれるまで、ラベルは表示されません。

これは、UI スレッドで長い操作を行っているという事実と関係があることを理解しており、おそらくバックグラウンドワーカーを使用して作業を行う必要があります。

バックグラウンドワーカーの使用方法に関する適切で簡単な例を知っている人はいますか? これまでに発見したことは、私には複雑すぎるか、複雑すぎます。

ありがとうございました

クルーズ

4

4 に答える 4

1

ラベルだけを更新したい場合は、更新する必要があります。

labelLoadedLeft.Text = "Loading " + count + " files so far";
labelLoadedLeft.Update();

どのバージョンの VS/C# を使用していますか? VS2012/C#5.0 では、新しい「待機」機能を利用できます。コードが読みやすくなり、UI の更新は呼び出しなどなしで実行できます。

于 2012-11-26T15:44:20.837 に答える
1

これは BackgroundWorker で実行できます。例はhttp://dotnetforum.net/topic/34729-how-to-cancel-backgroundworker-during-getfiles/です。

ただし、すべてのファイルのリストを取得するまで、UI には何も表示されません。そして、あなたが言ったように、これは遅いです。

一度に 1 つのファイルを返すEnumerateFilesメソッドhttp://msdn.microsoft.com/en-us/library/dd383458(v=vs.100).aspxを使用します。

于 2012-11-26T15:49:40.013 に答える
1

.NET 4.0 を使用していると仮定すると、バックグラウンド ワーカーはTPLを介して最も簡単に処理されます。次のようなコードを使用して、バックグラウンドでワーカーを開始できます。

Task.Factory.StartNew( () =>
{
   // Background Worker Stuff goes here
}, TaskCreationOptions.LongRunning);

次に、ワーカーのジョブを別のクラス/関数に配置し、yield returnからの結果を取得して、返されるものの を取得DoWork()できますIEnumerable<T>foreachループを次のように使用します。

foreach(var item in DoWork())
{
   // Update UI
}

結果が戻ってきたら、UI を更新できることを意味します。 Yield return列挙可能な全体が戻る前にアイテムを処理できるようにします。ただし、注意yield returnしてください。プログラム内にステート マシンを暗黙的にセットアップするため、このような機能が必要でない限り、このイディオムを使用するのは非常に無駄です。

于 2012-11-26T15:49:41.817 に答える
0

あなたはそれを必要としないかもしれません。ListView で Begin/EndUpdate を使用します。

http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.beginupdate.aspx

これにより、アイテムがすべて読み込まれるまでアイテムの描画が防止されます。カウントを維持することはできませんが、特にこれが速すぎて問題にならない場合は、その利点がまったくわかりません。

于 2012-11-26T15:45:26.663 に答える