社区
C#
帖子详情
C# 多线程 操作Datable
ycy54942
2012-09-27 06:11:18
现在我要用winfrom 做个多线程的程序 比如 生成10个线程 去修改 DataTable 里面的的值,Datablale有100行数据
我要用10线程去分别修改dataTable,如果10个线程中有一个线程先完毕了,然后立即去修改下一条数据比如是第11行然后再发现有线程完毕了再用线程去执行第12条(1个线程执行一行)。以此类推,一直到10线程把100行数据都修改掉。
我应该怎么做,请各位大侠请教!分不够可以加!
...全文
483
13
打赏
收藏
C# 多线程 操作Datable
现在我要用winfrom 做个多线程的程序 比如 生成10个线程 去修改 DataTable 里面的的值,Datablale有100行数据 我要用10线程去分别修改dataTable,如果10个线程中有一个线程先完毕了,然后立即去修改下一条数据比如是第11行然后再发现有线程完毕了再用线程去执行第12条(1个线程执行一行)。以此类推,一直到10线程把100行数据都修改掉。 我应该怎么做,请各位大侠请教!分不够可以加!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ggewt2td
2012-09-28
打赏
举报
回复
举个例子:
第一步:线程先读一条未处理的记录,
select min(主键) 编号 from 表 where 线程号=0
第二步:
update 表 set 线程号={自身线程号} where 编号={选出的编号} and 线程号=0
第三步:
然后筛选属于自己线程的任务:
select * from 表 where 线程号={自身线程号}
因为可能多个线程读到同一条记录,所以第二步可能更新不到记录,第三步也就读不到记录,
第三步若读不到记录,再重新从第一步开始执行:
如果第三步读到记录,就开始处理记录。
开启事务,
处理
提交/回滚.
但这个存在一个问题,
如果执行到第三步,而且能读到记录,然后处理,但处理中途,该线程死掉,
就会导致这条记录一直挂在那个线程上,再没有别的线程能够处理该记录。
所以需要设置一个延时时间,如果线程接受处理该记录,但超过指定时间,还没提交,
则需要关闭该线程,然后删除线程号,给别的线程来处理。
yonglaixiazaide
2012-09-28
打赏
举报
回复
一个线程 负责一段 索引
lshfong
2012-09-28
打赏
举报
回复
每个线程分段执行,就不会出现脏数据的操作了
ZWYyj
2012-09-28
打赏
举报
回复
为什么要用这么多线程,使简单的操作变得复杂。。。。不过4楼的讲解得很详细。。。
种草德鲁伊
2012-09-28
打赏
举报
回复
多余,用多线程有什么用?
ggewt2td
2012-09-28
打赏
举报
回复
其实还有一种简单的而且保险的做法,
需要定义两个DataTable,
一个是处理的DataTable1,一个是用来备份的DataTable2,
线程获取 DataTable1 里的一条记录来处理,获取时,将DataTable1锁住,
取出一条记录后,将该记录从DataTable1里删掉,然后释放锁,
然后处理该记录,处理完后,再锁住DataTable2,将处理的结果更新回DataTable2,释放锁。
ggewt2td
2012-09-28
打赏
举报
回复
楼上,你的 nCurRowIndex 要不要锁?
stonespace
2012-09-28
打赏
举报
回复
没必要这么复杂,就用lock锁定分配就行,
class XXX
{
Object rLock=new Object();
DataTable tTable=new DataTable();
int nCurRowIndex=0;
private DataRow GetRowToProcess()
{
lock(rLock)
{
if (nCurRowIndex>=tTable.Rows.Count)
{
return null;
}
DataRow rResult=tTable.Rows[nCurRowIndex];
nCurRowIndex++;
return rResult;
}
}
//这个是线程函数
void DoProcess()
{
while(true)
{
DataRow rRow=GetRowToProcess();
if (rRow==null)
{
break;
}
//...这里处理rRow,
}
}
}
ggewt2td
2012-09-27
打赏
举报
回复
因为数据库是采用行锁的方式,
所以这个设计很讲究,
这个做法,可以先领取任务,
比如十个线程,都各自领取一条记录做任务,
给记录增加一个字段:“领取线程号”,
领取后,就更新该线程号,
然后领取任务时,只读线程号为0(就是么有领取的任务)的,
为0表示没有线程处理,没有处理就不会被锁,这样就不会导致锁定等待了,
然后处理时,就读属于自己线程号的记录,然后锁住,这样可以避免别的线程锁定
ggewt2td
2012-09-27
打赏
举报
回复
你可以先分配一下任务,
给100条记录编个顺序号,
第一个线程处理编号为1到10的记录,
第二个线程处理编号为11到20的记录,
第三个线程处理编号为21到30的记录,
....
依此类推
当然,还有一种做法,
就是每个线程处理一条记录,就将该记录锁起来,
不给其它记录处理,处理完后再释放锁,这样就不会冲突了。
比如增加一列“状态”,状态分三个状态:“未处理、处理中、处理完毕”
一个线程处理某条记录,就标志该记录状态为“处理中”,
这样就不会冲突了,
另外还要结合事务锁来处理,
先把那条记录锁起来,很简单,开启事务,
然后先更改状态为“处理中”,因为修改了记录,就会锁住那条记录,
别的线程读不到的,但这会导致别的线程被锁住,
ycy54942
2012-09-27
打赏
举报
回复
就是的 感觉很容易撞车 很多数据都被覆盖掉了 我应该怎么写呢
吾非大神
2012-09-27
打赏
举报
回复
用线程池。。
qldsrx
2012-09-27
打赏
举报
回复
要注意别交叉操作了,最好分配每个线程一个索引范围去操作,一条条操作很容易撞车。
C#
读写redis
C#
读写实时数据库
本文将使用一个gitHub开源的组件技术来读写redis数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取
操作
只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写
操作
github地址:https://github.com/dathlin/HslCommunication 如果喜欢可以star或是fork,还...
海量、多页数据导出到Excel(
C#
版本)
海量、多页数据导出到Excel(
C#
版本) 最近做了一个项目,其中需要将多个
Data
GridView中的数据导出到一个Excel文件中,如:整体情况统计表、审核情况明细表及不合格原因统计表。开始觉得难度不大,可是深入进去后发现问题多多。 1、 数据量大:一个明细表中包含的数据基本上超过10w,不能采用常规的一行行导入,必须批量导入; 2、
C#
将多个
Data
Ta
ble
添加到指定的
Data
Set中
如何将多个
Data
Ta
ble
添加到指定的
Data
Set中 事件起因:从数据库中,查询多个
data
Ta
ble
,现在想一下子返回多个ta
ble
,所以就想到用
DATA
SET,遇到下面的两个现象,现在记录下,做个参考。
Data
Set ds = new
Data
Set();//创建数据集
Data
Ta
ble
dt1 = BIZ.GetSalesInfo();//获取出售信息表
Data
Ta
ble
dt2 =
postgresql(2)
C#
如何将批量将数据记录添加到数据库
这里使用
C#
ADO.NET进行对于postgresql数据库的控制,,实现需要引入Mono.Security.dll,Npgsql.dll,网上有很多博客相关的,这里不过多介绍。(推荐一篇博客https://www.cnblogs.com/PowerOfHeart/p/7138003.html) 之后如何将批量大规模数据导入数据库中呢,比如说你现在有一个txt文件里面全是记录,如何将这个tx...
C#
导入数据使用Task异步处理耗时任务
C#
多线程
中,我们可以使用async和await来异步处理耗时任务。现在我们打开一个Excel表格,将Excel表格的每一行数据进行处理,并存储到数据库中。
C#
111,092
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章