Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用多线程读取ListView_C#_Multithreading_Listview_Items - Fatal编程技术网

C# 如何使用多线程读取ListView

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

我想读取表单中的listview

我的目标是让程序读取前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 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交互不太好。不管怎么说,通过使用线程,你不会给自己买任何东西。