首页 > 解决方案 > 从数据表中多线程读取 - C#

问题描述

我有一个多线程环境(Web 应用程序),我有一个静态数据表(在我的 ConcurrentDictionary 自定义缓存对象中),我仅用于从中读取数据。

与从该数据表循环读取的所有页面共享相同的静态数据表是否安全?我猜想通过索引从行中访问和读取数据应该是线程安全的?

如果我以下列方式访问我的数据表对象呢?或者我应该使用我的 GetFromCache() 方法将 datatable.copy() 对象返回给每个调用线程?

DataTable dtcountrySelector = GetFromCache(some conditions);

        if (dtcountrySelector != null)
        {
            List<MarketPlace> convertedList = (from drCountry in dtcountrySelector.AsEnumerable()
                                 select new MarketPlace()
                                 {
                                     SiteName = Convert.ToString(drCountry["name"] ?? ""),
                                     SiteId = Convert.ToInt32(drCountry["siteid"] ?? 0),
                                     SiteCode = Convert.ToString(drCountry["sitecode"] ?? "")                               
                                 }).ToList();

            return convertedList;

谢谢你。

标签: c#multithreadingdatatable

解决方案


该类对于多线程读取操作是安全DataTable的。但是您应该知道,ADO.NET 类是高度互连的,看似无害的操作仍然会导致. 例如,调用该方法足以改变 a 的内部状态,即使没有在集合中添加行。另一个例子:当两个s 都是同一个 s 的一部分时,向另一个 s 添加行可能会导致两个s 发生突变。DataTableDataTable.NewRowDataTableDataTable.RowsDataTableDataTableDataSetDataTable


推荐阅读