【问题标题】:How to reading out ListView using MultiThreading如何使用多线程读取 ListView
【发布时间】: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?之后清理Tasklistaktuellethreads。好吧,即使没有,这也不会 100% 好用,因为您在等待任务完成时才采用 4-th 元素。我会在一分钟内写出正确的答案。
  • 让多个线程与 UI 交互效果不佳。无论如何,通过线程执行此操作不会给自己买任何东西。

标签: c# multithreading listview items


【解决方案1】:

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

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 答案框中编写了这段代码,但我认为它可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多