将 Foreach 分成线程示例

2024-04-09

我想跑”SearchResultByOrderNumber(string orderNumber)” 中的方法Foreach与多线程。有十个订单号OrderNumbers数据表。在搜索这些 OrderNumbers 时OrderResultsDatatable,我想把这些OrderNumber分成5个线程。在每个线程中都会有两次对 OrderNumbers 的搜索。如何使用 Asp.Net 3.5 Framework 执行此线程?

我想,我必须重新提出我的问题。 如何自动将“OrderNumbers”划分为异步方法? 首先,我得到了rowCount。我将定义异步方法计数。然后我会得到rowsPerAsyncMethods按划分rowCount with asyncMethodCount.

rowsPerAsyncMethods = rowCount / asyncMethodCount

谢谢。

void Main()
{   

    var MyTask1Caller = new Func<DataTable>(MyTask1);
    var asyncResultMyTask1 = MyTask1Caller.BeginInvoke(null, null);
    var MyTask2Caller = new Func<DataTable>(MyTask2);
    var asyncResultMyTask2 = MyTask2Caller.BeginInvoke(null, null);

    DataTable dtMyTask1 = MyTask1Caller.EndInvoke(asyncResultMyTask1);
    DataTable dtMyTask2 = MyTask2Caller.EndInvoke(asyncResultMyTask2);
    Console.WriteLine("dtMyTask1");
    Console.WriteLine("dtMyTask2");
    asyncResultMyTask1.AsyncWaitHandle.WaitOne();
    asyncResultMyTask2.AsyncWaitHandle.WaitOne();


}

public int RowCount()
{
    DataTable dt = OrderNumbers();
    int items = dt.Rows.Count;

    return items;

}


public DataTable MyTask1()
{
    DataTable dtResult = new DataTable();
    DataColumn dc = new DataColumn("OrderNumber", typeof(System.Int32));
    dtResult.Columns.Add(dc);
    dc = new DataColumn("OrderResult", typeof(string));
    dtResult.Columns.Add(dc);

    DataTable dtOrders = new DataTable();
    dtOrders = OrderNumbers();

    var items = dtOrders.AsEnumerable()
    .Select(n => n).Take(3).CopyToDataTable();

    foreach(var order in items.AsEnumerable())
    {   

        string orderNumber = order["OrderNumber"].ToString();
        string orderResult = SearchResultByOrderNumber(orderNumber);
        DataRow dr = dtResult.NewRow();
        dr["OrderNumber"] = orderNumber;
        dr["OrderResult"] = orderResult;
        dtResult.Rows.Add(dr);
    }

    //Thread.Sleep(5000);       
    return dtResult;
}


public DataTable MyTask2()
{
    DataTable dtResult = new DataTable();
    DataColumn dc = new DataColumn("OrderNumber", typeof(System.Int32));
    dtResult.Columns.Add(dc);
    dc = new DataColumn("OrderResult", typeof(string));
    dtResult.Columns.Add(dc);

    DataTable dtOrders = new DataTable();
    dtOrders = OrderNumbers();

    var items = dtOrders.AsEnumerable()
    .Select(n => n).Skip(3).Take(3).CopyToDataTable();

    foreach(var order in items.AsEnumerable())
    {   

        string orderNumber = order["OrderNumber"].ToString();
        string orderResult = SearchResultByOrderNumber(orderNumber);
        DataRow dr = dtResult.NewRow();
        dr["OrderNumber"] = orderNumber;
        dr["OrderResult"] = orderResult;
        dtResult.Rows.Add(dr);
    }


    return dtResult;
}

    public string SearchResultByOrderNumber(string orderNumber)
    {

        DataTable dt = new DataTable();
        dt = OrderResults();

        var query = (from n in dt.AsEnumerable()
                    where n["OrderNumber"].ToString() ==orderNumber
                    select n["OrderResult" ].ToString()).FirstOrDefault();
        return query;
    }

    public DataTable OrderResults()
    {

                DataTable dt = new DataTable("OrderResults");
                DataColumn dc = new DataColumn("OrderNumber", typeof(System.Int32));
                dt.Columns.Add(dc);
                dc = new DataColumn("OrderResult", typeof(string));
                dt.Columns.Add(dc);

                for(int i=1; i<10; i++)
                {
                    DataRow dr = dt.NewRow();
                    dr["OrderNumber"] = i;
                    dr["OrderResult"] =i +" Result";
                    dt.Rows.Add(dr);
                }

                return dt;
    }


    public DataTable OrderNumbers()
    {

                DataTable dt = new DataTable("OrderNumbers");
                DataColumn dc = new DataColumn("OrderNumber", typeof(System.Int32));
                dt.Columns.Add(dc);

                for(int i=0; i<10; i++)
                {
                    DataRow dr = dt.NewRow();
                    dr["OrderNumber"] = i;
                    dt.Rows.Add(dr);
                }

                return dt;
    }

如果 .NET 4.0 可用,您只需使用 Parallel.ForEach 构造即可。

如果没有,并行处理就像使用ThreadPool类,还有一些额外的同步工作:

int tasks = 0; // keep track of number of active tasks
object locker = new object(); // synchronization object

foreach(var order1 in dtOrders.AsEnumerable())
{
    lock(locker) tasks++; // added a new task
    var order = order1; // local copy to avoid data races
    ThreadPool.QueueUserWorkItem(
       o =>
       {          
            string orderNumber = order["OrderNumber"].ToString();
            string orderResult = SearchResultByOrderNumber(orderNumber);
            DataRow dr = dtResult.NewRow();
            dr["OrderNumber"] = orderNumber;
            dr["OrderResult"] = orderResult;

            lock(locker) // update shared data structure and signal termination
            {
                dtResult.Rows.Add(dr);
                tasks--;
                Monitor.Pulse(locker);
            }                
       });
}

// barrier to wait for all tasks to finish
lock(locker)
{
   while(tasks > 0) Monitor.Wait(locker); 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Foreach 分成线程示例 的相关文章

  • Caliburn.Micro - ShowDialog() 如何关闭对话框?

    EDIT 新信息 刚刚设法让记录器工作 老实说 我不知道 cm 有一个 并且在尝试使用时收到此消息TryClose TryClose requires a parent IConductor or a view with a Close m
  • 使用 Json.NET 序列化子类

    我正在尝试使用 Json NET 序列化子类 生成的 json 包含超类的序列化属性 但是not子类对象的属性 这似乎与我发现的一个问题有关这里就这样 https stackoverflow com q 5863496 498969 但必须
  • 自动映射器多对多 stackoverflowException

    我遇到以下映射的堆栈溢出 Mapper CreateMap
  • 平滑手绘曲线

    我有一个允许用户绘制曲线的程序 但这些曲线看起来不太好 它们看起来摇摇欲坠 而且是手绘的 所以我想要一种能够自动平滑它们的算法 我知道平滑过程中存在固有的模糊性 因此它不会每次都完美 但这种算法似乎确实存在于多个绘图包中 并且它们工作得很好
  • 使用 C# 将多个音频样本混合到单个文件中

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个能够创建音频文件 mp3 或 wav 的库 NAudio http www codeple
  • 在没有 epsilon 的情况下可以将浮点数与 0.0 进行比较吗?

    我知道 要比较两个浮点值 需要使用一些 epsilon 精度 因为它们并不精确 但是 我想知道是否存在边缘情况 我不需要那个 epsilon 特别是 我想知道这样做是否总是安全的 double foo double x if x lt 0
  • C# 无法捕获 SerializationException

    我的程序在加载序列化文件的部分遇到问题 如果文件无法反序列化 我希望很好地失败 但由于某种原因 我的程序将中断而不是进入 catch 子句 这是我的代码 using FileStream fs new FileStream openFile
  • 如何在C中同时运行两个子进程?

    所以我开始学习并发编程 但由于某种原因我什至无法掌握基础知识 我有一个名为 fork c 的文件 其中包含一个 main 方法 在此方法中 我将 main 分叉两次 分别进入子进程 1 和 2 在孩子 1 中 我打印了字符 A 50 次 在
  • 组合框下拉位置

    我有一个最大化的表单 其中包含 500px 的组合框控件 停靠在右上角 Width 尝试打开组合框后 列表的一半超出了屏幕 如何强制列表显示在表单中 棘手的问题 我找不到解决这个问题的好办法 只是一个解决方法 添加一个新类并粘贴如下所示的代
  • 无法加载程序集问题

    我收到以下错误 无法加载程序集 错误详细信息 System BadImageFormatException 无法加载文件或程序集 文件 或其依赖项之一 该程序集是由比当前加载的运行时更新的运行时构建的 无法加载 该程序集是使用 Net Fr
  • Linq 合并列表

    我的课 public class Foo public int A get set public List
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 如何减少 MinGW g++ 编译器生成的可执行文件的大小?

    我有一个简单的 Hello world C 程序 在 Win XP 下由 MinGW g 编译器编译为 500kB 可执行文件 有人说这是由于iostream的库和静态链接libstdc dll Using s链接器选项有点帮助 减少了 5
  • 在c#中获取没有时间的日期

    我的表上有一列 缺勤日期时间 日期 当我想要获取包含日期的行时 它返回 0 行 这是我的 C 代码 DateTime ClassDate DateTime Parse lblDate Content ToString var Abs dbs
  • 如何将STL容器数据转储到gdb中?

    我无法在 gdb 中转储 STL 无序映射容器值 变量类型是 std unordered map var 我的 gdb 版本 7 7 1 GDB配置 configure host x86 64 linux gnu target x86 64
  • 如何在 C# 中更改公共 IP 地址

    我正在创建一个 C winform 应用程序 我想在其中更改公共 IP 地址 而不是像 Hotspot Shield ZenMate OpenVPN 等那样更改 IPv4 地址 我已经检查了以下链接 但没有找到足够的帮助 所以我发布了这个问
  • valgrind 在 Raspberry Pi 上返回未处理的指令

    我最近一直在尝试在运行 Debian GNU Linux7 0 喘息 的树莓派 型号 b 上使用 valgrind 来调试分段错误 每次我在编译的 C 程序上运行 valgrind 时 都会得到类似以下内容的信息 disInstr arm
  • 当我的进程被终止时到底会发生什么?

    我有一个包含本机代码和托管代码的混合进程 在 Windows Server 2003 上运行 当我从进程资源管理器中终止进程时 它会进入 100 cpu 的状态 并在消失之前保持这种状态一段时间 有时甚至 10 分钟 在此期间我无法 杀死
  • 如何在c#中创建多线程

    我需要监听机器中的所有串行端口 假设我的机器有 4 个串行端口 我必须创建 4 个线程并开始分别使用附加线程监听每个端口 我使用此代码来获取我的机器中的端口数量 private SerialPort comPort new SerialPo
  • 实体框架代码首次日期字段创建

    我正在使用实体框架代码优先方法来创建我的数据库表 下面的代码 创建一个DATETIME数据库中的列 但我想创建一个DATE柱子 DataType DataType Date DisplayFormatAttribute ApplyForma

随机推荐

  • 如何使用 Python 从网页的检查元素中获取数据

    我想使用 Python 从检查元素获取数据 我可以使用 BeautifulSoup 下载源代码 但现在我需要来自网页的检查元素的文本 如果您能建议我如何去做 我将不胜感激 编辑 我所说的检查元素是指 在谷歌浏览器中 右键单击为我们提供了一个
  • 如何将 Visual Studio 宏值放入预处理器指令中?

    在我的项目中 我需要访问的价值 SolutionDir 运行时的宏 为此 我尝试添加预处理器条目 例如DEBUG ROOT SolutionDir or DEBUG ROOT SolutionDir 但这会由于无效的转义序列而导致各种编译器
  • 代码签名想要使用密钥签名 - 不允许或始终允许但拒绝有效

    我正在尝试构建并存档该应用程序 编译后 会出现一个警告窗口 要求 codesign wants to sign using key my account Name in your keychain 和按钮Always Allow Deny
  • 动态从模块导入类

    我有一堂课叫 my class 放在 my module 我需要导入这个类 我尝试这样做 import importlib result importlib import module my module my class 但它说 Impo
  • Net5 上的 ServiceProcessInstaller 在哪里?

    过去我使用过这些课程安装人员 https learn microsoft com en us dotnet api system configuration install installer view netframework 4 8 服
  • 将 Android 升级到 4.3 后,run-as 提示“程序包未知”

    我有一个简单的脚本 可以将数据库从手机下载到我的电脑 它使用 run as 效果很好 但现在 run as 说 包未知 我的应用程序已安装在设备上 没有任何变化 只是 Android 更新到了 4 3 你也有同样的问题吗 如何绕过这个或解决
  • SwiftUI:停止永远重复的动画

    我想在屏幕上有一个类似 徽章 的东西 当满足条件时 它会从正常尺寸弹到更大 然后反复恢复到正常尺寸 直到不再满足条件 不过 我似乎无法让徽章停止 弹跳 一旦开始 就势不可挡 我尝试过的 我尝试过使用一些动画 但它们可以分为使用 repeat
  • Android 版 OpenCV:示例项目 ClassNotFound 异常

    我正在尝试运行适用于 Android 的 opencv 示例 它不起作用 java lang RuntimeException Unable to instantiate activity ComponentInfo org opencv
  • Rake / Rspec:如何使用 --pattern 抑制/安静/静音显示命令的第一条输出行?

    Problem 如果我跑ServerSpec 基于RSpec 通过Rake使用以下命令之一 rake rake spec rake spec all rake spec
  • 将字符串拆分为数组数组[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在写一个iOS App in 斯威夫特 4 2 来自服务器的响应是一个字符串 其值由管道字符 分隔 它包含许多行值
  • Bash:如何仅在完整的行中复制交互式脚本的输入/输出?

    如何实时捕获脚本的输入 输出 例如使用 tee 但逐行而不是逐个字符 我的目标是仅在退格键和自动完成完成处理后 按下 RETURN 键后 捕获输入到脚本交互式提示中的输入 具体来说 我正在尝试为 ssh 创建一个包装器脚本 该脚本创建远程服
  • 无法从 SwingWorker 类更新 JProgressBar

    我有我的主 GUI 线程 其中有一个 JprogressBar 并正在实现 ProprtyChangeListener 当按下按钮时 扩展 SwingWorker 的不同类就会启动并执行一系列可能很长的计算 我需要 A 类中的进度条来根据
  • npm 崩溃并显示“ERR!cb() 从未调用”

    我试图使用安装 vue cli npm install g vue cli 我收到以下错误 Unhandled rejection Error EACCES permission denied mkdir home moeketsi npm
  • Android ffmpeg 简单 JNI 包装器

    我一直在尝试使用带有命令行访问的 ffmpeg 二进制文件一段时间 但一无所获 使用runtime exec 看起来我能够让它工作的唯一方法是使用 C 中的包装器来使用 JNI 访问构建的 ffmpeg 库 主要问题 我已经有超过五年没有编
  • Guava 地图中的驱逐惰性

    当前的地图驱逐算法相当懒惰 看起来过期的对象只有在访问数据结构时才会被驱逐 例如 从地址到索引器的映射定义为 ConcurrentMap
  • 将控件定位在复选框的中间

    这是我之前问题的后续 依赖于字体的控制定位 https stackoverflow com questions 37306 font dependent control positioning 这是试图解决这个问题real这个问题背后的问题
  • BigTable中的布隆过滤器可以仅根据行ID进行过滤吗?

    BigTable 使用布隆过滤器来允许点读取 以避免访问给定键列对内不包含任何数据的 SSTable 如果查询只指定行 ID 而没有列 ID 这些布隆过滤器是否也可用于避免访问 SSTable BigTable 使用行列对作为插入其布隆过滤
  • 检测ES模块是否在Node中从命令行运行

    在 Node 中使用 CommonJS 模块时 您可以使用以下命令检测脚本是否正在从命令行运行require main module 在 Node 中使用 ES 模块时 检测脚本是否正在从命令行运行的等效方法是什么 使用 experimen
  • 套接字编程Python:如何确保收到完整消息?

    我正在使用 python 3 x 和套接字模块 服务器在 ipv4 地址上运行并使用 tcp 我阅读了一些有关如何发送和接收数据的教程 对于服务器或客户端 要确保发送整个消息 您可以简单地检查发送的数据量是否等于消息的大小 def myse
  • 将 Foreach 分成线程示例

    我想跑 SearchResultByOrderNumber string orderNumber 中的方法Foreach与多线程 有十个订单号OrderNumbers数据表 在搜索这些 OrderNumbers 时OrderResultsD