如何使用多线程读出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 答案框中编写了这段代码,但我认为它可以工作。
我想在表单中读出一个列表视图。
我的目标是让程序读取前 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 答案框中编写了这段代码,但我认为它可以工作。