2

にアイテムを追加するときは、次の方法を使用していますListView

ダブルバッファリングを確実に行い、ListView考えられるすべてを最適化しようとしましたが、アイテムをすばやく追加すると、何をしてもUIが遅くなります。

私はかなり長い間この問題を抱えており、解決策を見つけようと探し回っていましたが、修正できなかったため、毎回あきらめました. 今回はこの問題を解決したいと考えています。:)

私は多分いくつかのカスタムソリューションを使用することについて考えましたか? 「SPEED」に対応できる良いものはありますか?または、現在のコードでできることはありますか?

方法:

private void AddNewItemToListView(string gPR, string rank, string category, string name, string url, string email, string address, string phone, string metadesc, string metakeywords, string mobile, string numbofreviews, string rating, string facebook, string twitter, string googleplus, string linkedin, string sitemap, string siteage, string backlinks, string trafficvalue)
{
    Invoke(new MethodInvoker(
        delegate
            {
                string[] row1 = { url, urlSec, address, phone, metadesc, metakeywords, mob, REV, RT, gPR, FB, TW, googleplus, LI, ST, SA, BL, TV };
                ListViewItem item = new ListViewItem();

                flatListView1.Items.Add(name).SubItems.AddRange(row1);                               
            }
        ));
}
4

2 に答える 2

2

作業の開始時に ListView.SuspendLayout() メソッドを使用し、終了時に ListView.ResumeLayout() を呼び出すことはできますか? それは物事をかなりスピードアップすると思います。また、フィードバックを得るために定期的に再開することもできます。たとえば、指定された位置に次のコードを挿入します。

// Start of work
flatListView1.SuspendLayout();

// Below code inside your delegate

flatListView1.Items.Add(name).SubItems.AddRange(row1);   

if ((flatListView1.Items.Count % 1000) == 0)
{
    // Force a refresh of the list
    flatListView1.ResumeLayout();
    // Turn it off again
    flatListView1.SuspendLayout();         
}

// End of code inside delegate

// Resume layout when adding is finished

flatListView1.ResumeLayout();
于 2012-10-11T16:36:34.637 に答える
2

UI に直接追加する代わりに、ゆっくりと消費され、毎秒 x アイテムで UI に追加されるリストに追加できます。以下に緩い例を簡単に書きましたが、詳細はこちらで読むことができます: http://msdn.microsoft.com/en-us/library/dd267312.aspx

private BlockingCollection queue;

public void Start() 
{
    queue = new BlockingCollection<string[]>();
    Task.Factory.StartNew(() => { 
        while(!queue.IsCompleted) 
        { 
            var item = queue.Take(); 
            //add to listview and control speed 
        } 
    });

    Start.Whatever.Produces.Items();
    //when all items added to queue.
    queue.CompleteAdded();

}

private void AddnewItemToListView(...) 
{
    var row = ...;
    queue.Add(row);
}
于 2012-10-11T16:17:41.260 に答える