多线程MySqlDataAdapter.Fill 同一个dataset会出现table为Null?

本人QQ-554433626 2020-12-04 08:28:29
系统目前的缓存就是一个静态dataset。多线程下同时缓存,fill进dataset会出现Null的情况,就是dataset中的其中一个table为Null了,然后就崩了。
...全文
5018 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2020-12-06
  • 打赏
  • 举报
回复
1.为了避免麻烦首先应该选用线程安全列表,这样你就不会陷入到你后面的问题。和有些人不同,他们会不断告诉你们,怎么飞檐走壁,飞车漂移。而我们只会告诉你,非必要情况,请老老实实走路。你自己不做,就不会die。非要整天飞檐走壁,然后说我挂了,然后教你怎么不挂?这路数怎么都有些不正经哦 2.既然用了非线程安全列表,那么请自己保证他安全。 3.有关lock,为啥上面有人强调“静态对象”,其实“静态对象”只是某园子里的规范,而我们这边认为的是“只读对象”,用lock的对象请别随意new,本来你想给他上锁,确有不停的换门。门都换了,怎么锁??
本人QQ-554433626 2020-12-06
  • 打赏
  • 举报
回复
你说得对。dataset不是线程安全的,只有锁dataset。目前我的做法是fill(datatable),然后锁dataset.tables.add(table)这步。
  • 打赏
  • 举报
回复
引用 4 楼 jun471537173 的回复:
lock的是静态对象还是实例对象啊

什么叫做“静态对象”?

一个声明
private static DataSet MySet
不是说什么“静态对象”,这个变量是声明在类型上而不是声明在对象实例上。可没有什么“静态对象”这种说法,对象就是对象,MySet 变量只要不为 null 就是引用的一个对象,没有什么“静态对象”。
  • 打赏
  • 举报
回复
如果使用共享变量的代码“实在太多”那么就要进行代码的大的整理,运用面向对象的方法,自己开发一个新的 class 来管理数据,将此 TheDataSet 封装到这个对象内部(不对外开放),仅开放几个接口方法,各个调用代码仅能通过接口方法来访问需要的结果。这样就能在这个 class 代码的各个接口方法上写 lock(TheDataSet) 语句,避免各个调用方法胡乱操作。
  • 打赏
  • 举报
回复
“数据是没问题的”其实与操作无关,工作中注意不要用无关的“没问题的”来搪塞或者干扰真正的问题。

多个地方共享这个 TheDataSet 对象,并且你有一些耗时操作,那么你就应该处理“冲突”问题。要为所有读写这个 table 的地方写上 lock(TheDataSet) 语句,使得读写操作进入“互斥管理区”保证只有一个线程在区内。
gs0038 2020-12-05
  • 打赏
  • 举报
回复
引用 1 楼 本人QQ-554433626 的回复:
单个线程不会有问题。也就是说数据是没问题的…
第二张图有一个table为空,你检查看看是不是有哪一个地方的代码执行设置为null的
jun471537173 2020-12-05
  • 打赏
  • 举报
回复
lock的是静态对象还是实例对象啊
本人QQ-554433626 2020-12-04
  • 打赏
  • 举报
回复
单个线程不会有问题。也就是说数据是没问题的…

62,053

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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