如何将任务并行库与 DataReader 结合使用

2024-04-28

我经常用数据填充数据读取器并像这样填充 UI

using (SqlConnection conn = new SqlConnection("myConnString"))
using (SqlCommand comm = new SqlCommand("Select * from employee where salary<5000", conn))
{
    conn.Open();

    SqlDataReader reader = comm.ExecuteReader();

    if (reader.HasRows)
    {
        while (reader.Read())
        {
            // here i populate my employee class
        }
    }
    // here i update UI
}

我正在搜索任务并行库与 DataReader 的使用并找到了一段代码。它看起来不错,但目标对我来说不是很清楚。这是我得到的代码。

public IEnumerable<MyDataClass> ReadData()
{
using (SqlConnection conn = new SqlConnection("myConnString"))
using (SqlCommand comm = new SqlCommand("myQuery", conn))
{
    conn.Open();

    SqlDataReader reader = comm.ExecuteReader();

    if (reader.HasRows)
    {
        while (reader.Read())
        {
            yield return new MyDataClass(... data from reader ...);
        }
    }
}
}

打电话像

Parallel.ForEach(this.ReadData(), data =>
{
// Use the data here...
});

OR

this.ReadData().AsParallel().ForAll(data => 
{
// Use the data here...
});

我怎样才能从中获取数据ForAll.

任何人都可以帮助我理解代码片段,它是如何工作的以及如何从中获取数据ForAll我如何填充我的用户界面ForAll.

另一个问题是我如何知道哪个类是线程安全的。线程安全是什么意思。有人说 datareader 不是线程安全的。他怎么知道。

何时应该使用任务并行库的另一个问题。 请指导。谢谢


您可以在 MSDN 文档的 .NET 基类库中找到有关每种类型的线程安全性的信息。大多数类型是not线程安全。SqlDataReader例如,是not线程安全,因为它在与数据库的单个连接上工作。

然而,Parallel.ForEach是一个非常清晰的结构。你不能真正迭代IEnumerable同时使用多个线程,并且Parallel.ForEach不这样做。尽管它启动了多个线程并且这些多个线程确实在给定的IEnumerable, Parallel.ForEach确保仅one迭代枚举时的线程IEnumerator。它的运行假设是处理元素比从可枚举中获取项目花费更多的时间。迭代可枚举是一个顺序操作。

这意味着即使底层数据源和使用SqlReader不是线程安全的,您仍然可以使用并行处理项目Parallel.ForEach。不幸的是,MSDN 文档对此不是很明确,但必须如此,因为IEnumerator返回的实例GetEnumerator()方法从来都不是线程安全的。

但你仍然必须确保给定的Action<T>当然是线程安全的。

您可以使用以下程序查看此行为:

public static IEnumerable<int> GetNumbers()
{
    for (int i = 0; i < 140; i++)
    {
        Console.WriteLine(
            "                          Enumerating " + 
            i + " at thread " +
            Thread.CurrentThread.ManagedThreadId);

        yield return i;
    }
}

static void Main(string[] args)
{
    Console.ReadLine();

    Parallel.ForEach(GetNumbers(), number =>
    {
        Console.WriteLine("Processing " + number + 
            " at thread " +
            Thread.CurrentThread.ManagedThreadId);

        Thread.Sleep(1);
    });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将任务并行库与 DataReader 结合使用 的相关文章

随机推荐

  • Rails:计划任务来预热缓存?

    我使用以下内容通过 memcached 缓存加载缓慢的页面 caches action complex report expires in gt 1 day 控制器操作受 Devise 身份验证保护 当前 该页面在用户第一次请求时被缓存 当
  • 如何在 OpenMDAO 1.x 中使用嵌套问题?

    我正在尝试在 OpenMDAO 上实现协作优化和其他多级架构 我读here https stackoverflow com questions 32612456 how to setup multi level mdo formulatio
  • ChromeOS 上 Android 应用的侧面加载和调试机制是什么?

    我已经经历了一切http www chromium org chromium os android apps http www chromium org chromium os android apps并且还观看了 IO 视频 似乎没有提到
  • 无法获取 Ripple 会话信息

    我使用 Visual Studio 2015 RC 创建了一个 Ionic Apache Cordova 应用程序 我在自己的解决方案文件中创建了它 并且可以使用 Ripple 运行它 现在我想将文件移动到与服务器应用程序相同的文件夹中 因
  • Django:从 QueryDict 读取 JSON 对象数组

    如何通过 JS 的 AJAX 调用传递复合 JSON 结构 并在服务器端将其读取为 python 中的 非常相似 的数据结构 我知道可以使用 json 格式 simplejson 等 但我不知何故觉得 QueryDict 本身在我的情况下格
  • 根据大量 python 数据帧的字数删除关键字

    如果我有这个df具有 41 000 行的数据框包含数千个单词 例如像这样df column1 column2 better spotted better rights rights rights fresh fresh rights rig
  • 如何确定通过“from m import *”导入了什么?

    我正在对导入语句进行一些修补 我需要确切地知道哪些成员是由from m import 该文档似乎表明 当 all 不存在时 将导入所有不以下划线开头的成员 这在所有情况下都是正确的吗 我知道inspect getmembers dir an
  • HTML5 什么是 itemscope 属性?用外行人的话来说它有什么作用?

    我只是想知道 HTML5 itemscope 属性的基本用途是什么 The itemscope attribute 是一个布尔属性 用于定义元素中包含的元数据的范围 它定义在HTML5 微数据 http www w3 org TR micr
  • 自动装箱和原始类型以匹配方法签名

    版本中1 5 Java引入了概念auto boxing public interface SomeInterface public void test Integer val public class Main implements Som
  • 从 Javascript 检测真实的边框、填充和边距

    有没有办法从 Javascript 代码中检测元素的真实边框 填充和边距 如果你看下面的代码
  • 字符串变量可能尚未初始化(错误指向第 34 行)

    我一直在尝试让字符串初始化 但无济于事 我已经尝试了我遇到的所有解决方案 我不确定是因为我的无能还是因为我需要一个新的解决方案 我已经解决了程序的逻辑 所以我只需要帮助尝试初始化字符串值 如果有人可以提供帮助 我将不胜感激 P S 诅咒我想
  • nginx工作进程如何共享“监听套接字”

    This http aosabook org en nginx html http aosabook org en nginx html说 工作进程接受来自共享 监听 套接字的新请求 并在每个进程内执行高效的运行循环 我查看了代码 但不明白
  • WPF 应用程序没有“固定到任务栏”选项

    我创建了几个 WPF 应用程序 但是当在 Windows 7 任务栏中右键单击它们时 我只是得到一个 关闭 Windows 选项 通常有一个 固定到任务栏 选项 我不知道它去了哪里 是否有任何需要启用或任何东西 我在用 VS2010 Ble
  • 弱实体是否可以参与与其他表的识别和非识别关系?

    显然 一个弱实体 作为子实体 必须参与一种或多种识别关系 否则它就不会是弱的 但同时 它也可以是非认同关系中的孩子吗 是的 弱实体集可以参与与其他实体的非识别关系entities 我认为 子 是指弱实体集位于关系的决定 多 方的关系 对于弱
  • 如何在 Chrome/Safari 中调试 EJS 代码

    我正在将 EJS 模板与 CanJS 一起使用 并正在寻找一种调试我的 EJS 代码的方法 目前 firebug 可以向我显示 EJS 中的语法错误 但在其他浏览器中 我看不到任何内容 我需要非常仔细地检查我的 EJS 文件来解决错误 我在
  • C#“as”与“()”转换[重复]

    这个问题在这里已经有答案了 为什么在这种情况下兼容引用类型之间的转换会编译 Excel 2010 Net 4 5 using Excel Microsoft Office Interop Excel Excel Application ex
  • 无约束类型参数错误

    我正在尝试将 glium 与 cgmath 连接起来 下列的这个答案 https stackoverflow com a 40028032 5397009 我已经实现了ToArray要转换实例的特征cgmath Matrix4转换成 gli
  • 如何隐藏我的应用程序但不关闭/完成它

    我想让用户通过隐藏它但不完成它来离开我的应用程序 我可以在主要活动中调用 finish 但这需要一些时间 这不利于用户体验 因此更好的选择可能是隐藏它 只是我不知道如何实现它 感谢您的所有回答 我不想在后台做某事 因为我已经有服务了 在我的
  • Tkinter 和 Tix 的颜色图表

    我想要可视化一些基本颜色 这样我就可以为我的配色方案选择合适的颜色 我在任何地方都找不到颜色图表 因此修改了示例来显示它 这是一个好方法吗 import Tix as tk import tkinter tix as tk for Pyth
  • 如何将任务并行库与 DataReader 结合使用

    我经常用数据填充数据读取器并像这样填充 UI using SqlConnection conn new SqlConnection myConnString using SqlCommand comm new SqlCommand Sele