如何判断所有子线程已结束?

gnimgnot 2010-05-31 03:42:31
前景提要:
我要操作一个文件型数据库,开了50个线程。
一边从internet获取数据一边insert
但是运行的时候会报数据库被锁,我不知道怎么处理这个问题。
所以想等数据全部取完了存在list里一起insert。
但是又不知道怎么判断子线程已完成任务。

...全文
421 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gnimgnot 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyazhe 的回复:]
可以设置标记
或是自定义事件
或是使用Thread的Join方法。
每个线程结束后执行某个方法,方法中累计,如果和开始的线程数一样,就触发一个事件。
[/Quote]

谢谢你的回复。
我想了一下,可以设置一个类变量。然后各个线程来++这个变量,然后触发事件。
但这样的话,主线程岂不是要在一个while(true)里等待事件?
gnimgnot 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gomoku 的回复:]
引用 6 楼 cuit 的回复:
引用 4 楼 gomoku 的回复:
另:“操作一个文件型数据库,开了50个线程”很不见得能加快处理,建议先试验和评估。


哦。
我开线程的主要目的是从internet获取数据。
但是又处理不好,获取数据和insert to数据库的关系
因为如果完全获取完了再insert的话
又太占内存了。

是个合理的用多线程的理由。

是否也可以由……
[/Quote]

由线程各自更新数据库会抛出异常
提示 database is locked (sqlite)
我不知道怎么等待解锁了再insert
gomoku 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cuit 的回复:]
引用 4 楼 gomoku 的回复:
另:“操作一个文件型数据库,开了50个线程”很不见得能加快处理,建议先试验和评估。


哦。
我开线程的主要目的是从internet获取数据。
但是又处理不好,获取数据和insert to数据库的关系
因为如果完全获取完了再insert的话
又太占内存了。
[/Quote]
是个合理的用多线程的理由。

是否也可以由线程各自更新数据库?
gnimgnot 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gomoku 的回复:]
另:“操作一个文件型数据库,开了50个线程”很不见得能加快处理,建议先试验和评估。
[/Quote]

哦。
我开线程的主要目的是从internet获取数据。
但是又处理不好,获取数据和insert to数据库的关系
因为如果完全获取完了再insert的话
又太占内存了。
jiezi316 2010-05-31
  • 打赏
  • 举报
回复
1 定义一AutoEventSet[]
2 等候子线程结束的线程 WaitHandle.WaitAll(AutoEventSet[]),即INSERT线程
3 每个子线程结束设置其对应的AutoResetEvent为终止状态。AutoResetEvent.Set()

解释,当AutoEventSet数组全部为终止状态之前, WaitHandle.WaitAll()始终阻塞,直到全部信号量都为终止状态
gomoku 2010-05-31
  • 打赏
  • 举报
回复
另:“操作一个文件型数据库,开了50个线程”很不见得能加快处理,建议先试验和评估。
zhouxingyu896 2010-05-31
  • 打赏
  • 举报
回复
线程的状态
兔子-顾问 2010-05-31
  • 打赏
  • 举报
回复
可以设置标记
或是自定义事件
或是使用Thread的Join方法。
每个线程结束后执行某个方法,方法中累计,如果和开始的线程数一样,就触发一个事件。
gomoku 2010-05-31
  • 打赏
  • 举报
回复
Thread.Join()

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧