http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 12165|回复: 16

[求助] 多线程委托添加listview问题

[复制链接]
发表于 2014-9-13 13:31:21 | 显示全部楼层 |阅读模式
研究了一段时间,还是有点不明白。单线程没问题,多线程就报错。我想通过多线程给listview同时添加内容
我贴下自己代码,大家看看那里不对,帮改下,。下面代码是没有多线程的情况下运行时可以使用。
但是多线程不如知道如何写。就是用10个线程同时添加内容。不是添加好了1个就绪下1个添加。我的目的是这样。
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication19
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)//启动后自动添加10项内容
        {
            for (int i = 0; i < 10; i++)
            {
                ListViewItem list = new ListViewItem();
                list.Text = "1";
                list.SubItems.Add("2");
                list.SubItems.Add("");
                list.SubItems.Add("");
                listView1.Items.Add(list);
            }
        }
        delegate void delegate_list(int i);//申明委托
        delegate_list list1;//申明委托“变量”(实例化的时候用,我是这么理解)
        private void button1_Click(object sender, EventArgs e)
        {
            list1 = new delegate_list(listadd);//实例化委托
            for (int i = 0; i < 10; i++)
            {
                list1(i);//调用委托 
            }            
        }
        private void listadd(int i)
        {
            listView1.Items[i].SubItems[2].Text ="测试添加内容" ;
        }

    }
}


8888888888.png


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2014-9-13 13:47:54 | 显示全部楼层
我怎么就没听明白要干嘛呢
 楼主| 发表于 2014-9-13 14:01:50 | 显示全部楼层
站长苏飞 发表于 2014-9-13 13:47
我怎么就没听明白要干嘛呢

通过10个线程添加测试内容几个字。不是通过10次循环添加的。意思
发表于 2014-9-13 14:27:07 | 显示全部楼层
但是你没有开线程啊。http://www.sufeinet.com/forum.ph ... on=view&ctid=26参考我的例子
 楼主| 发表于 2014-9-13 14:50:34 | 显示全部楼层
站长苏飞 发表于 2014-9-13 14:27
但是你没有开线程啊。http://www.sufeinet.com/forum.php?mod=collection&action=view&ctid=26参考我的例子

我是没开,不知道如何写,
你的我早看过了。有点看不懂。所以想让你帮写个,我在修改基础上的,多线程。方便我理解,你那个台复杂了。感觉,我这水平看不懂
发表于 2014-9-13 14:51:18 | 显示全部楼层
加个锁
回复

使用道具 举报

发表于 2014-9-13 14:59:27 | 显示全部楼层
里面有简单的,看解决界面不卡的那个
 楼主| 发表于 2014-9-13 18:44:49 | 显示全部楼层
站长苏飞 发表于 2014-9-13 14:59
里面有简单的,看解决界面不卡的那个

我还是看不懂,飞大,能不能根据我这个来修改下。我代码贴出来给你,帮忙下哈
需要修改和添加的地方我都备注了,我的目的就是10个线程同时启动给listview添加内容,不报错
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication19
{
    public partial class Form1 : Form
    {
        int iii = 0;
        public Form1()
        {
            InitializeComponent();
        }
        //启动后自动添加10项内容
        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < 10; i++)
            {
                ListViewItem list = new ListViewItem();
                list.Text = "1";
                list.SubItems.Add("2");
                list.SubItems.Add("");
                list.SubItems.Add("");
                listView1.Items.Add(list);
            }
        }
        //定义委托
        delegate void Delegate_list(int i,int ii,string msg);
        Delegate_list delegate_list;
        //定义委托要使用的方法
        private void listadd(int i, int ii, string msg)
        {
            listView1.Items[i].SubItems[ii].Text = msg;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //实例化委托(不知道这样说对不对)
            delegate_list = new Delegate_list(listadd);
            //启动10个线程 准备同时给listview添加内容
            for (int ii = 0; ii < 10; ii++)
            {
                Thread thread_list = new Thread(new ParameterizedThreadStart (delegate_list));//这里也不知道如何写因为带参数委托
                thread_list.Start(ii);
            }          
        }
        //线程要运行的函数
        private void Run(int i,string msg)
        {
            //这里本来是要给listview添加内容的
            //因为现在是用了多线程要用委托添加
            //否则会提示跨线程操作UI错误
            //所以我这里不知道如何写,请帮我写下


        }
    }
}
 楼主| 发表于 2014-9-13 18:45:53 | 显示全部楼层
回复

使用道具 举报

发表于 2014-9-13 21:10:11 | 显示全部楼层
本帖最后由 minidick 于 2014-9-23 23:36 编辑

新创建的线程不能访问UI线程里的控件,可以用BeginInvoke通过消息的机制让UI线程执行。
可以参考一下这么写。

[C#] 纯文本查看 复制代码
using System.Threading.Tasks;

private void listadd(int i, int ii, string msg)
{
    if (InvokeRequired)
    {
        BeginInvoke((Action)delegate { listadd(i, ii, msg); });
    }
   else
    {
        listView1.Items[i].SubItems[ii].Text = msg;
    }
}


private void button1_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 10; i++)
    {
        int a = i;
        Task.Factory.StartNew(() => listadd(a, 0, "text"));
    }
}

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-22 11:27

© 2014-2021

快速回复 返回顶部 返回列表