C# 如何使用多线程读取ListView
我想读取表单中的listview 我的目标是让程序读取前3行,然后它必须睡眠几毫秒(随机),然后它必须使用接下来的3行,直到使用所有listviewitems 我试过这样做,但程序总是在前3行延迟后检查整个列表C# 如何使用多线程读取ListView,c#,multithreading,listview,items,C#,Multithreading,Listview,Items,我想读取表单中的listview 我的目标是让程序读取前3行,然后它必须睡眠几毫秒(随机),然后它必须使用接下来的3行,直到使用所有listviewitems 我试过这样做,但程序总是在前3行延迟后检查整个列表 List<Task> Tasklist = new List<Task>(); List<ListViewItem> lit = new List<ListViewItem>(); int aktuellethre
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 Tasklist=new List();
List lit=新列表();
int-aktuelle=0;
int最大线程数=3;
this.Invoke(新操作(()=>
{
foreach(listView1.Items中的ListViewItem itt)
{
添加(itt);
}
}));
foreach(列表视图项目i亮起)
{
if(Aktuelle螺纹<最大螺纹)
{
Task t=Task.Run(()=>
{
随机rnd=新随机();
线程睡眠(rnd.Next(30010000));
});
任务列表。添加(t);
aktuelle++;
}
如果(AktuellerThreads>=最大线程数)
{
Task.WaitAny(Tasklist.ToArray());
阿克图埃勒;
}
}
为了使其正确,您应该改变检查方法
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();
}
}
List tasklist=new List();
List lit=新列表();
int最大线程数=3;
this.Invoke(新操作(()=>
{
foreach(listView1.Items中的ListViewItem itt)
{
添加(itt);
}
}));
foreach(列表视图项目i亮起)
{
Task t=Task.Run(()=>
{
随机rnd=新随机();
线程睡眠(rnd.Next(30010000));
});
任务列表。添加(t);
如果(tasklist.Count>=最大线程数)
{
Task.WaitAll(tasklist.ToArray());
tasklist.Clear();
}
}
它应该可以工作,我不是100%确定语法,因为我在SO答案框中写了这段代码,但我认为它可以工作。让这篇文章看一看。(我无法对此发表评论,因为代表率低)。那么,这显然有什么关系呢?因为此代码似乎只是一次将所有项目从
listView1
加载到lit
,然后使用任务在lit
上迭代。因此,在这些迭代中,它将在开始时迭代前3项,如果有任何任务可以释放,则会逐个迭代其余的任务,而不是以3个为一批进行迭代。是的,Dominik,你说得对,但我如何做到这一点?每次只迭代3项?也许可以尝试WaitAll?然后清理Tasklist
和aktuellethreads
。好吧,即使没有,这也不能百分之百的好,因为你在等待任务完成的时候使用了第四个元素。我将在一分钟内写出正确的答案。让多个线程与UI交互不太好。不管怎么说,通过使用线程,你不会给自己买任何东西。