项目中的代码记录日常 - 并行任务处理

项目中的代码记录日常

/// <summary>
/// 修改任务状态
/// </summary>
private void StartProcess21()
{
    Process21Task = new Thread(() =>
    {
        while (CommonUtility.IsWorking)
        {
            try
            {
                if (tPAgvTasksList.Count > 0)
                {
                    Parallel.ForEach(tPAgvTasksList, new ParallelOptions() { MaxDegreeOfParallelism = 16 }, item =>
                    {
                        // 判断 一期 或 二期
                        //var StagePlc = item.Stage == 1 ? PlcDevice1 : PlcDevice2;
                        // 通知PLC动作完成
                        PlcDevice1.Write(item.DbChunk, WriteNumber);
                        PlcDevice2.Write(item.DbChunk, WriteNumber);
                        Logger.Info($"PLC写入状态 , 偏移量:{item.DbChunk};订单:{item.OrderId};状态:{item.Status}");

                        int Id = item.Id;
                        int Sign = 1;
                        // 修改数据库查询标记并保存
                        _repository.UpdateTask(Id, Sign);

                        ListItem = item;
                    });
                    // 移除当前对象
                    tPAgvTasksList.Remove(ListItem);
                    Logger.Info($"当前数据数量为:{tPAgvTasksList.Count()};");
                }
            }
            catch (Exception ex)
            {
                Logger.Error($"异常信息:{ex.Message}");
            }
            // 短暂休眠
            Thread.Sleep(DormancyTimeCount);
        }
    });
    Process21Task.IsBackground = true;
    Process21Task.Start();
}

详细解释

  1. 方法定义
private void StartProcess21()
定义了一个名为 StartProcess21 的私有方法,用于启动一个线程来修改任务状态。
  1. 创建线程
Process21Task = new Thread(() =>
创建一个新的线程 Process21Task,并使用 lambda 表达式定义线程的主体。
  1. 循环条件
while (CommonUtility.IsWorking)
线程将在 CommonUtility.IsWorking 为 true 时持续运行。
  1. 异常处理
try
{
    // 代码块
}
catch (Exception ex)
{
    Logger.Error($"异常信息:{ex.Message}");
}
使用 try-catch 块捕获可能的异常,并在日志中记录异常信息。
  1. 检查任务列表
if (tPAgvTasksList.Count > 0)
检查 tPAgvTasksList 列表中是否有任务需要处理。
  1. 并行处理任务
Parallel.ForEach(tPAgvTasksList, new ParallelOptions() { MaxDegreeOfParallelism = 16 }, item =>
{
    // 代码块
});
使用 Parallel.ForEach 并行处理 tPAgvTasksList 中的每个任务,最大并行度为 16
  1. PLC写入操作
PlcDevice1.Write(item.DbChunk, WriteNumber);
PlcDevice2.Write(item.DbChunk, WriteNumber);
Logger.Info($"PLC写入状态 , 偏移量:{item.DbChunk};订单:{item.OrderId};状态:{item.Status}");
向 PlcDevice1 和 PlcDevice2 写入状态,并在日志中记录写入信息。
  1. 更新数据库标记
int Id = item.Id;
int Sign = 1;
_repository.UpdateTask(Id, Sign);
获取任务的 Id 和设置标记 Sign 为 1,然后调用 _repository.UpdateTask 方法更新数据库中的任务标记。
  1. 移除已经处理任务
ListItem = item;
tPAgvTasksList.Remove(ListItem);
Logger.Info($"当前数据数量为:{tPAgvTasksList.Count()};");
将当前处理的任务赋值给 ListItem,然后从 tPAgvTasksList 中移除该任务,并在日志中记录当前任务列表的数量。
  1. 短暂休眠
Thread.Sleep(DormancyTimeCount);
线程休眠一段时间,避免过度占用 CPU 资源。
  1. 设置线程为后台线程并启动
Process21Task.IsBackground = true;
Process21Task.Start();
将 Process21Task 设置为后台线程并启动。

总结
该代码的主要功能是启动一个后台线程,定期检查并处理任务列表中的任务。具体步骤包括:

检查任务列表中是否有任务需要处理。
并行处理每个任务,向 PLC 设备写入状态并更新数据库中的任务标记。
从任务列表中移除已处理的任务。
在日志中记录相关信息。
线程休眠一段时间后继续检查任务列表。
通过这种方式,代码实现了任务状态的异步更新和处理,确保系统的高效运行。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值