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

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 9561|回复: 10

[C#语言基础] C#多线程更新界面求助

[复制链接]
发表于 2013-7-30 19:25:58 | 显示全部楼层 |阅读模式

委托、BackgroundWorker 都用了、但是最后几个总会漏掉。
求解决,代码如下:
[code=csharp]using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using System.Diagnostics;



namespace 爆破
{
    public partial class Form1 : Form
    {
        int counting = 0,listJs=0,file=0;
        object obj=new object ();
        List<string> list = new List<string>();
        List <BackgroundWorker >dw=new List<BackgroundWorker>() ;
       bool Run = true;
        public Form1()
        {
            InitializeComponent();
        }


        private void 导入SidToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog fileDialog = new OpenFileDialog();
            fileDialog.Multiselect = true;
            fileDialog.Title = "请选择文件";
            fileDialog.Filter = "文本文件(*.txt)|*.txt";
            this.listView1.BeginUpdate();
            if (fileDialog.ShowDialog() == DialogResult.OK)
            {
                string file = fileDialog.FileName;

                using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
                {
                    using (StreamReader sr = new StreamReader(fs, Encoding.GetEncoding("gb2312")))
                    {
                        string line;
                        while ((line = sr.ReadLine()) != null)
                        {
                            ListViewItem item = new ListViewItem(new string[] { line, "" });
                            listView1.Items.Add(item);
                            list.Add(line);
                        }
                    }
                }
                this.listView1.EndUpdate();
                toolStripStatusLabel2.Text = "一共导入" + listView1.Items.Count.ToString() + "个Sid...";
            }
        }

        private void 清空列表ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.listView1.Items.Clear();            
        }

        private void 开始爆破ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (listView1.Items.Count <= 0) MessageBox.Show("对不起,请先导入Sid!", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            else
            {
                listJs = this.listView1.Items.Count;
                for (int i=0;i<10;i++)
                {
                    dw . Add(new BackgroundWorker ());
                    dw.WorkerReportsProgress = true;//声明异步执行的时候可以报告进度
                    dw.WorkerSupportsCancellation = true;//声明可以异步取消  
                    dw.DoWork += new DoWorkEventHandler(this.dw_DoWork);
                    dw.ProgressChanged += new ProgressChangedEventHandler(this.dw_ProgressChanged);
                    dw.RunWorkerAsync();
                    //Thread.Sleep(100);
                }
            }
        }
        private void 停止运行ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Run = false;
        }
        private void dw_DoWork(object sender, DoWorkEventArgs e)
        {
            int SidFZ = 0;
            string Sid, zt;
            while (Run)
            {

                lock (obj)
                {

                    if (counting >= listJs) break;
                    SidFZ = counting;
                    Sid = list[SidFZ];
                    counting++;
                    Debug.Print(SidFZ.ToString());
                    this.BeginInvoke(new MethodInvoker(delegate() { this.listView1.EnsureVisible(SidFZ); }));
                }
                if (baopo(Sid))
                {
                    zt = "爆破成功";
                    file++;//
                }
                else zt = "失败";
                    try
                    {

                        dw[0].ReportProgress(SidFZ, zt);

                        Debug.Print(zt);
                    }
                    catch (Exception q)
                    { Debug.Print(q.Message.ToString()); }
            }
        }
        private void dw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            string zt = e.UserState.ToString();
            int i = e.ProgressPercentage;
            this.listView1.Items.SubItems[1].Text = zt;
            
        }
        private bool baopo(string Sid)
        {
            string setText = HttpHelper.Get("http://openapi.3g.qq.com/invitation/callback?cid=1000&appId=900000546&it=1&sid=" + Sid + "&cid=navigation");
            return inStr(setText);
        }
        private static bool inStr(string txt)
        {

            int i = txt.IndexOf("正在跳转,请稍候...");
            if (i != -1) return true;
            else return false;
        }
    }
}
[/code]


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2013-7-30 19:28:17 | 显示全部楼层
发表于 2013-7-30 21:56:55 | 显示全部楼层
invoke
回复

使用道具 举报

 楼主| 发表于 2013-7-30 23:03:27 | 显示全部楼层

没有用的BeginInvoke和Invoke我都试过、都是一样的结果、后面一样会漏掉几个
发表于 2013-7-31 08:07:34 | 显示全部楼层
漏掉几个是什么意思,你的图片看不到啊,你发图片时单击高级模式可以上传图片的
 楼主| 发表于 2013-7-31 20:23:04 | 显示全部楼层
站长苏飞 发表于 2013-7-31 08:07
漏掉几个是什么意思,你的图片看不到啊,你发图片时单击高级模式可以上传图片的

就是这样子了
7c1ed21b0ef41bd5b2e4680e50da81cb38db3d90.jpg
 楼主| 发表于 2013-7-31 22:53:26 | 显示全部楼层
@站长苏飞 求解决了飞哥
发表于 2013-8-1 08:05:35 | 显示全部楼层
小羽茼學 发表于 2013-7-31 22:53
@站长苏飞 求解决了飞哥

缺失我估计是因为执行异常,或者是执行到了没有输出项的问题吧。你给一个默认值看看会不会输出,就是指定一个死值,别的什么也有执行,先看看是线程没有执行还是方法中出错了
 楼主| 发表于 2013-8-1 21:32:36 | 显示全部楼层
站长苏飞 发表于 2013-8-1 08:05
缺失我估计是因为执行异常,或者是执行到了没有输出项的问题吧。你给一个默认值看看会不会输出,就是指定 ...

如果把这个判断设置为true,那就可以执行完毕、但是应该不会是访问网页的问题才对吧
QQ截图20130801213119.png
发表于 2013-8-1 21:34:35 | 显示全部楼层
说明不是线程问题,是你线程里的程序问题
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-11-15 17:04

© 2014-2021

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