欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

多线程访问DataTable

程序员文章站 2022-05-07 14:09:30
项目中需要读取数据库中的多张表。由于表的数据比较多,串行读取时耗时比较多,所以对程序做了一点优化。 环境 .NET 3.5,SQL Server 2012,Visual Studio 2015 过程 项目中使用存储过程串行地读取数据库,存储过程接受同一个表变量作为参数。但是当在多线程中复制DataT ......

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

环境

.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://*.com/questions/1314155/returning-a-value-from-thread