项目中需要读取数据库中的多张表。由于表的数据比较多,串行读取时耗时比较多,所以对程序做了一点优化。

环境

.NET 3.5,SQL Server 2012,Visual Studio 2015

过程

项目中使用存储过程串行地读取数据库,存储过程接受同一个表变量作为参数。但是当在多线程中复制DataTable时有可能会出现异常,这是因为DataTable里的Rows不是线程安全的。不过微软提供了一个叫SyncRoot的对象帮助我们在多线程时对DataTable进行操作。代码如下

public static MyObject GetData(DataTable dataTable)
{MyObject myObject = new MyObject();DataTable tempTable = new DataTable();// Lock the columns.lock (dataTable.Columns.SyncRoot){// Lock the rows.lock (dataTable.Rows.SyncRoot){tempTable = dataTable.Copy();}}ReadFromDatabase(tempTable);// Write your own code.return myObject;
}

多线程下的使用方法如下

public static void Test()
{DataTable dataTable = new DataTable();MyObject obj = null;Thread thread = new Thread(() =>{obj = GetData(dataTable);});// Start a new thread.thread.Start();// Wait this thread terminated.thread.Join();
}

可以改进的地方

调用 thread.Join() 时会阻塞当前线程,直到thread结束。某些情况还是会影响一部分性能的。 .NET 4.0以上提供了更加简便的异步操作和线程安全的数据结构。但是由于现有的项目是使用 .NET 3.5写的,暂时也没有办法重构了

Reference

http://www.cnblogs.com/rui1236/p/4567420.html

https://stackoverflow.com/questions/1314155/returning-a-value-from-thread

转载于:https://www.cnblogs.com/DilonWu/p/8431865.html

多线程访问DataTable相关推荐

  1. sqlite数据库的多线程访问问题

    关于sqlite数据库的多线程访问问题,下面的链接提供了一个详细的说明: http://kagii.com/post/6828016869/android-sqlite-locking

  2. CoreData和SQLite多线程访问时的线程安全问题

    数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱. IOS中常用的两种数据持久化存储方式:CoreData和SQLite, ...

  3. [转] c#中 多线程访问winform控件

    原文 c#中多线程访问winform控件的若干问题小结 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来解决这个问题,下面我将详细的 ...

  4. 多线程不重复读取数据_别再犯错了,多线程访问同一个资源一定要上锁?

    大家都知道,多线程访问同一个资源必须要做同步互斥,一定要用到锁,这个说法是完全正确的吗? 以常见的生产者消费者模型举例,这里我们只有一个生产者,一个消费者.即,一个线程不断的从一个设备读取数据,放入缓 ...

  5. paip.C#.NET多线程访问 toolStripStatusLabel

    paip.C#.NET多线程访问 toolStripStatusLabel 作者Attilax ,  EMAIL:1466519819@qq.com toolStripStatusLabel控件比较特 ...

  6. wxpython多线程_WxPython 4.0.4多线程访问UI

    最开始做框架的时候的需求就是多线程访问UI,以前在.NET WPF使用MVVM和数据驱动很容易做到,在JavaSwing中使用另类的观察者模式也实现了.在WxPython中使用观察者模式直接程序崩溃, ...

  7. Java多线程学习三十一:ThreadLocal 是用来解决共享资源的多线程访问的问题吗?

    ThreadLocal 是不是用来解决共享资源的多线程访问的. 这是一个常见的面试问题,如果被问到了 ThreadLocal,则有可能在你介绍完它的作用.注意点等内容之后,再问你:ThreadLoca ...

  8. 多线程访问共同的代码或者对象:lock避免出错

    现在写程序多线程是不可避免的,而且经常会出现多线程访问共同资源的情况.多线程对共同资源的访问,往往会造成数据的混乱和不可预料的结果,因此一般需要加锁访问进行互斥访问.加锁就需要用到lock关键字.所谓 ...

  9. python sqlite3 多线程_在python中多线程访问sqlite3数据库

    Python标准库中有sqlite3模块,可见对此数据库的认可.不过,此模块在使用时也有限制,同一个数据库连接,不能在不同线程中共享. import threading import sqlite3 ...

最新文章

  1. Entity Framework学习三:查询、插入、更新和删除操作
  2. Java并发编程-并发工具包(java.util.concurrent)使用指南(全)
  3. java基础 关于转换流
  4. shutter 无法设置快捷键的解决方法
  5. 【Matlab】for循环进度条显示百分比进程和剩余时间
  6. 从一个小故事聊聊字符编码那些事
  7. 使用 OPEN SQL 语句读取数据库表数据的一个补充练习
  8. window 2008 和 windows vista windows 7 安装 MSMQ
  9. 淮阴工学院计算机期末考选择题题库,淮阴工学院PLC试题库.doc
  10. NOIP 贪心 国王游戏
  11. jitpack发布_JitPack –发布您的Android库
  12. python与中文的那点事
  13. 在linux上使用scp命令拷贝一个目录到另一台服务器的时候报not a regular file错误的解决办法...
  14. 微信小程序-canvas 2d带动画的半圆形刻度进度条
  15. 【Proteus仿真】DAC0832+51单片机汇编实现三角波输出
  16. 30分钟完成pandas入门
  17. 微信支付提示参数错误
  18. FSA-Net: Learning Fine-Grained Structure Aggregation for Head Pose Estimation from a Single Image
  19. python中占位符解释
  20. C++的边边角角扫盲

热门文章

  1. HDOJ 2642 HDU 2642 Stars ACM 2642 IN HDU
  2. 【MyBatis笔记】01-MyBatis入门程序
  3. 一年了,写点关于人生的东西吧
  4. String、StringBuffer、StringBuilder之间的区别 简明介绍
  5. 台式计算机的主流配置,2017年台式电脑主流配置单
  6. 让IT不加班,让业务不等待,一文讲透自助式分析的前世今生
  7. java fileinputstream 安全管理器校验失败_Spring Boot 如何做参数校验?
  8. python创建系列_一起学python系列之类(创建和使用类)
  9. python 导入包 导入模块
  10. 蓝桥杯java龟兔赛跑_蓝桥杯 1476: [蓝桥杯][基础练习VIP]龟兔赛跑预测