如何使用多线程读出ListView

How to reading out ListView using MultiThreading

我想在表单中读出一个列表视图。

我的目标是让程序读取前 3 行,然后它必须休眠几毫秒(随机),然后它必须使用接下来的 3 行,直到所有 listviewitems 都被使用。

我试过这样,但程序总是在前 3 行延迟后检查整个列表。

List<Task> Tasklist = new List<Task>();
            List<ListViewItem> lit = new List<ListViewItem>();

int aktuellethreads = 0;
int maximalethreads = 3;

            this.Invoke(new Action(() =>
            {
                foreach (ListViewItem itt in listView1.Items)
                {
                    lit.Add(itt);
                }
            }));

            foreach (ListViewItem i in lit)
            {
                if (aktuellethreads < maximalethreads)
                {
                    Task t = Task.Run(() =>
                    {
                        Random rnd = new Random();
                        Thread.Sleep(rnd.Next(300, 10000));
                    });
                    Tasklist.Add(t);
                    aktuellethreads++;
                }
                    if(aktuellethreads >= maximalethreads)
                    {
                    Task.WaitAny(Tasklist.ToArray());
                    aktuellethreads--;
                     }
             }

为了使它正确,你应该改变你的检查方法。

List<Task> tasklist = new List<Task>();
List<ListViewItem> lit = new List<ListViewItem>();

int maximalethreads = 3;

this.Invoke(new Action(() =>
{
    foreach (ListViewItem itt in listView1.Items)
    {
        lit.Add(itt);
    }
}));

foreach (ListViewItem i in lit)
{
    Task t = Task.Run(() =>
    {
        Random rnd = new Random();
        Thread.Sleep(rnd.Next(300, 10000));
    });
    tasklist.Add(t);

    if(tasklist.Count >= maximalethreads)
    {
        Task.WaitAll(tasklist.ToArray());
        tasklist.Clear();
    }
}

它应该可以工作,我不是 100% 确定语法,因为我在 SO 答案框中编写了这段代码,但我认为它可以工作。