马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

关于多线程问题

  [复制链接]
查看12762 | 回复10 | 2015-8-28 17:30:47 | 显示全部楼层 |阅读模式
20金钱
调试会把dataGridView1的行清空,导致直接跳出调试。
有没有人知道怎么解决或知道原因。

ibcadmin | 2015-8-29 09:57:09 | 显示全部楼层
贴代码
回复

使用道具 举报

剑弑 | 2015-8-29 13:50:59 | 显示全部楼层
哪图片就是所写的代码
回复

使用道具 举报

剑弑 | 2015-8-29 13:56:46 | 显示全部楼层
//类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Data;

namespace WindowsFormsApplication1
{
    class StartThread
    {
        int StartNum;//单条线程的处理行数
        int StartSum;//线程的处理总行数
        string FFName;//方法名字(带类名)
        public StartThread(int startSum, int startNum)
        {
            StartSum = startSum;
            StartNum = startNum;
        }
        public void C1()
         {
            
             if (StartSum % StartNum == 0)
             {
                 for (int i = 0; i < StartSum / StartNum; i++)
                 {
                     
                     Thread thr = new Thread(new ParameterizedThreadStart(C2));
                     thr.IsBackground=true;
                     thr.Start(i);
                 }
             }
             else
             {
                 for (int i = 0; i <Convert.ToInt32(StartSum / StartNum)+1; i++)
                 {
                     Thread thr = new Thread(new ParameterizedThreadStart(C2));
                     thr.IsBackground = true;
                     thr.Start(i);
                 }
             }
         }
        public void C2(object i)
        {
            
            
            Form1 fr = new Form1();
            int a = Convert.ToInt32(i);
            int b = Convert.ToInt32(StartSum / StartNum);
            if (a == Convert.ToInt32(StartSum / StartNum))
            {
                fr.thread1(StartNum,a);

            }
            else
            {
                fr.thread2(a, StartSum % StartNum, StartNum, Dt);
            }
        }
    }
}


//窗体
private void Form1_Load(object sender, EventArgs e)
        {
            dt.Columns.Add("Column6");
            dt.Columns.Add("C72");
            for (int i = 0; i < 109; i++)
            {
                DataRow dar = dt.NewRow();
                dar[0] = i;
                dar[1] = i;
                dt.Rows.Add(dar);
            }
            dataGridView1.DataSource = dt;
            StartThread th = new StartThread(109, 10);
            th.C1();
        }
public void  thread1(int h, int j )
        {
            int c = h * j;
            for (int i = 0; i < j; i++)
            {
                dataGridView1.Rows[c].Cells["C7"].Value = c;
                c++;
            }
        }
        public void thread2(int j,int a,int b)
        {
            int m = dt.Rows.Count;
            int c = j * b;
            for (int i = 0; i < a; i++)
            {
                dataGridView1.Rows[c].Cells["C7"].Value = c;
                c++;
            }
        }
回复

使用道具 举报

ibcadmin | 2015-8-31 09:08:41 | 显示全部楼层
检查c值是否为空 c值是j * b 所以也要检查这两个,还有,一般跳出线程都是抛异常了,断电调试下

点评

原因我已经想明白了,是开启线程时没有把Dt传到类里面;要传到类里面在传到窗体的方法才行,不过这样的话用数据就又乱了  详情 回复 发表于 2015-8-31 12:31
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
回复

使用道具 举报

剑弑 | 2015-8-31 12:31:32 | 显示全部楼层
ibcadmin 发表于 2015-8-31 09:08
检查c值是否为空 c值是j * b 所以也要检查这两个,还有,一般跳出线程都是抛异常了,断电调试下

原因我已经想明白了,是开启线程时没有把Dt传到类里面;要传到类里面在传到窗体的方法才行,不过这样的话用数据就又乱了
回复

使用道具 举报

剑弑 | 2015-8-31 12:35:02 | 显示全部楼层
我想实现的功能是,使用多线程在同一张表中每个线程各自处理表中的m行到n行(比如是0~100或100~200)
回复

使用道具 举报

jakey0108 | 2017-7-11 18:00:14 | 显示全部楼层
程序代码贴出来 看下

点评

这问题早自己解决了  详情 回复 发表于 2017-7-14 09:12
回复

使用道具 举报

剑弑 | 2017-7-14 09:12:15 | 显示全部楼层
jakey0108 发表于 2017-7-11 18:00
程序代码贴出来 看下

这问题早自己解决了
回复

使用道具 举报

jakey0108 | 2017-7-14 13:10:57 | 显示全部楼层
剑弑 发表于 2017-7-14 09:12
这问题早自己解决了

是多线程的异步加载吗

点评

不是  详情 回复 发表于 2017-7-27 09:58
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则