【发布时间】:2017-06-05 15:39:59
【问题描述】:
我想读出一个表单中的列表视图。
我的目标是让程序读取前 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--;
}
}
【问题讨论】:
-
看看这篇文章here。 (由于代表人数少,我无法发表评论)。
-
嗯,这显然有什么用?因为这段代码似乎只是一次将所有项目从
listView1加载到lit,然后用任务迭代lit。因此,在这些迭代中,它将在开始时迭代前 3 个项目,如果有任何任务将被释放,其余的将被迭代,一个接一个,而不是 3 个批次。 -
是的,你是对的 Dominik,但我怎么能做到每次只有 3 个项目?
-
也许试试 WaitAll?之后清理
Tasklist和aktuellethreads。好吧,即使没有,这也不会 100% 好用,因为您在等待任务完成时才采用 4-th 元素。我会在一分钟内写出正确的答案。 -
让多个线程与 UI 交互效果不佳。无论如何,通过线程执行此操作不会给自己买任何东西。
标签: c# multithreading listview items