【发布时间】:2021-03-27 01:20:41
【问题描述】:
我有一个多线程环境(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;
谢谢。
【问题讨论】:
-
谷歌搜索
datatable thread safety。并阅读docs.microsoft.com/en-us/dotnet/api/…。 -
为什么要将
DataTable存储在缓存中?为什么不存储convertedList呢? -
对不起。我浏览了很多文章,但没有想到只是阅读 msdn 文档。真的很感谢你的提示。至于其他评论。这是旧的 CMS 软件,唯一类型的缓存对象是 Datatable 类型。我完全同意更细化的方法可以进一步提高性能,因为我怀疑 Generic List 比 DataTable 更便宜。再次感谢您的回答。
-
注意:Web 应用程序已经在它们自己的线程上处理单独的 http 请求。也就是说,如果您的站点足够活跃,通常可以同时处理多个请求,那么您已经获得了开箱即用的多线程的好处,并且做得更多可能会扰乱线程调整并且实际上会变慢事情下来了。相反,为了提高 CPU 性能,您应该查看 异步 处理,它允许分配给单个 http 请求的单个线程对完成请求所需的每个任务进行排队,并在它们准备好时完成它们,以任何顺序。
标签: c# multithreading datatable