【问题标题】:Multithreaded read from Datatable - C#从数据表中多线程读取 - C#
【发布时间】: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


【解决方案1】:

DataTableis safe for multithreaded read operations。但是您应该知道,ADO.NET 类是高度互连的,看似无害的操作仍然可能导致DataTable 的内部状态发生突变。例如,调用DataTable.NewRow 方法足以突变为DataTable 的内部状态,即使没有在DataTable.Rows 集合中添加行。另一个例子:向另一个DataTable 添加行,当两个DataTables 是同一个DataSet 的一部分时,可能会导致两个DataTables 发生突变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2012-04-01
    相关资源
    最近更新 更多