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

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

12
返回列表 发新帖
楼主: hzljf1314

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

[复制链接]
发表于 2014-9-14 10:15:32 | 显示全部楼层
看过帖子回复一下是个好习惯


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2014-9-15 18:38:35 | 显示全部楼层
在不熟悉的情况下,最后把new都赋值到变量里,别偷懒不声明变量。
看了下你贴的第二段代码,代码很快就能实现你想要的功能。
提示下,线程执行的函数里,需要定义委托,然后调用控件的invoke(好像是这么拼的)
我博客上也有多线程的简单实例,不过是VB.NET的............
发表于 2014-9-16 13:49:14 | 显示全部楼层
我只是路过打酱油的。
发表于 2014-9-19 21:46:25 | 显示全部楼层
如果觉得委托烦的话可以酱紫
this.控件.Invoke(new Action(()=>
             {
                 //控件的操作
             }));

当然可以自定义个方法嘛 如:

private void TryInvoke(Action atcion)
{
        this.Invoke(()=>
        {
            action();
        }
}
调用的话:
TryInvoke(()=>
        {
             ///代码段
         });
发表于 2014-11-29 23:11:21 | 显示全部楼层
[C#] 纯文本查看 复制代码
using System;
using System.Threading;
using System.Windows.Forms;

namespace Text1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.listView1.View = View.Details;
            this.listView1.HeaderStyle = ColumnHeaderStyle.Clickable;
            this.listView1.Columns.Add("n1", -2);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            String Name = (sender as Button).Name;
            switch(Name)
            {
                case "button1": Thr_方法1(Name); break;
                case "button2": Thr_方法2(Name); break;
            }
        }

        delegate void Delegate_ListViewadd(string Str1);

        void Thr_方法1(String input)
        {
            Thread thread = new Thread(Thr_方法1_B);
            thread.IsBackground = true;
            thread.Start(input);
        }

        void Thr_方法1_B(object input)
        {
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(1000);
                this.Invoke((EventHandler)(delegate
{
    listView1.Items.Add(input as string + ":" + i);
    listView1.Items[listView1.Items.Count - 1].EnsureVisible();
}));
            }
        }

        void Thr_方法2(String input)
        {
            Thread thread = new Thread(Thr_方法2_A);
            thread.IsBackground = true;
            thread.Start(input);
        }
        void Thr_方法2_A(object input)
        {
            Delegate_方法2_B的委托 s1 = new Delegate_方法2_B的委托(Thr_方法2_B);
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(1000);
                this.Invoke(s1, input as string + ":" + i);
            }
        }
        delegate void Delegate_方法2_B的委托(String Str1);
        void Thr_方法2_B(String Str1)
        {
            listView1.Items.Add(Str1);
            listView1.Items[listView1.Items.Count - 1].EnsureVisible();
        }
    }
}
发表于 2014-11-29 23:21:19 | 显示全部楼层
下面是Demo
方法一是匿名委托写法
方法二是一般委托写法
[C#] 纯文本查看 复制代码
using System;
using System.Threading;
using System.Windows.Forms;

namespace Text1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.listView1.View = View.Details;
            this.listView1.HeaderStyle = ColumnHeaderStyle.Clickable;
            this.listView1.Columns.Add("n1", -2);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            String Name = (sender as Button).Name;
            switch(Name)
            {
                case "button1": Thr_方法1(Name); break;
                case "button2": Thr_方法2(Name); break;
            }
        }

        delegate void Delegate_ListViewadd(string Str1);

        void Thr_方法1(String input)
        {
            Thread thread = new Thread(Thr_方法1_B);
            thread.IsBackground = true;
            thread.Start(input);
        }

        void Thr_方法1_B(object input)
        {
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(1000);
                this.Invoke((EventHandler)(delegate
{
    listView1.Items.Add(input as string + ":" + i);
    listView1.Items[listView1.Items.Count - 1].EnsureVisible();
}));
            }
        }

        void Thr_方法2(String input)
        {
            Thread thread = new Thread(Thr_方法2_A);
            thread.IsBackground = true;
            thread.Start(input);
        }
        void Thr_方法2_A(object input)
        {
            Delegate_方法2_B的委托 s1 = new Delegate_方法2_B的委托(Thr_方法2_B);
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(1000);
                this.Invoke(s1, input as string + ":" + i);
            }
        }
        delegate void Delegate_方法2_B的委托(String Str1);
        void Thr_方法2_B(String Str1)
        {
            listView1.Items.Add(Str1);
            listView1.Items[listView1.Items.Count - 1].EnsureVisible();
        }
    }
}
发表于 2015-7-22 10:40:23 | 显示全部楼层
mark,说不定就会用到
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

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

© 2014-2021

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