首页 > 编程语言 >C# 异步自动数据采集功能

C# 异步自动数据采集功能

时间:2024-09-26 11:45:02浏览次数:8  
标签:异步 parmeterGatherInfo C# await FormGuid 采集 任务 var parmeterGather

/// <summary>
/// 执行数据采集命令
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
[HttpPost]
[Route("DataAcquisitionAuto")]
public async Task<MessageModel<string>> DataAcquisitionAuto(ProcedureParameterRecordDTO m)
{

    //① 启动任务:点击一个采集按钮时,启动对应的任务。
    //② 停止任务:如果点击当前正在进行的按钮,触发停止功能,并获取任务的执行时间。
    //③ 管理任务:点击新的按钮时,需要停止表单其他所有正在进行的任务,只保留当前点击的任务。

    Log4netHelper.Info("执行数据采集命令", "DataAcquisitionAuto", HelperTools.ConvertToJson(m));
    var retValue = new MessageModel<string>() { status = (int)StatusEnum.NO };

    var loginUser = JwtHelper.GetUserInfo(HttpContext.AuthenticateAsync().Result);

    //生成唯一标识符
    string taskId = $"{loginUser.UserCode}_{m.Nid}_{m.FormGuid}"; 
    try
    {
        var StepName = "";

        //获取采集信息
        var dataColConfigFirst = await db.Queryable<DataColWorkstepEntity>().Where(a => a.Nid == m.Nid).FirstAsync();
        if (dataColConfigFirst != null)
        {
            StepName = dataColConfigFirst.StepName;

            #region 记录最后一次按钮情况

                    //记录最新一次按钮情况
                    var parmeterGatherInfo = await db.Queryable<ProcedureParameterRecordEntity>()
                                                     .FirstAsync(x => x.FormGuid == m.FormGuid && x.ParameterName == "LatestCollection");

                    if (parmeterGatherInfo == null)
                    {
                        var parmeterGather = new ProcedureParameterRecordDTO();
                        HelperTools.ExchangeEntity(parmeterGather, m);
                        parmeterGather.CollectionStep = StepName;
                        parmeterGather.CollectionTime = DateTime.Now;
                        parmeterGather.ParameterValue = StepName;
                        parmeterGather.ParameterName = "LatestCollection";
                        parmeterGather.Nid = HelperTools.GetGuid();
                        parmeterGather.IsDelete = 0;
                        parmeterGather.CreateTime = DateTime.Now;
                        parmeterGather.CreateUserCode = loginUser.UserCode;
                        parmeterGather.CreateUserName = loginUser.UserName;
                        parmeterGather.CreateUserId = loginUser.UserId;

                        //parmeterGather.CollectionName = item.TableName;
                        parmeterGather.FormName = dataColConfigFirst.FormName;
                        parmeterGather.FormGuid = m.FormGuid;
                        parmeterGather.FormRemark = m.FormRemark;

                        var parmeter = new ProcedureParameterRecordEntity();
                        HelperTools.ExchangeEntity(parmeter, parmeterGather);

                        await db.Insertable(parmeter).ExecuteCommandAsync();
                    }
                    else
                    {
                        if (parmeterGatherInfo.ParameterValue == m.StepName)
                        {
                            parmeterGatherInfo.ParameterValue = "";
                        }
                        else
                        {
                            //已存在则更新
                            parmeterGatherInfo.ParameterValue = m.StepName;
                        }
                        await db.Updateable(parmeterGatherInfo).ExecuteCommandAsync();
                    }

                    #endregion
        }

        // 匹配当前任务是否已在执行中,如果存在则将当前任务取消
        if (TaskDictionary.TryGetValue(taskId, out var existingTaskInfo))
                {
                    // 记录取消时间
                    var cancelTime = DateTime.Now;

                    // 如果任务已经存在,取消当前任务
                    existingTaskInfo.Cts.Cancel();

                    try
                    {
                        await existingTaskInfo.Task; // 确保任务完成或取消
                    }
                    catch (OperationCanceledException)
                    {
                        // 处理任务取消
                        Log4netHelper.Info("任务已被取消");
                    }
                    catch (Exception ex)
                    {
                        Log4netHelper.Info(ex.Message);
                    }

                    //最大采集时间
                    var maxGather = new DateTime();

                    var startTimeCurr = existingTaskInfo.StartTime;

                    //获取最大采集时间
                    maxGather = startTimeCurr.AddHours(Convert.ToDouble(existingTaskInfo.CollectionDurationthis));

                    var elapsed = cancelTime - existingTaskInfo.StartTime;

                    // 将 TimeSpan 转换为时分秒格式
                    string elapsedTimeFormatted = string.Format("{0:D2}:{1:D2}:{2:D2}", elapsed.Hours, elapsed.Minutes, elapsed.Seconds);

                    TaskDictionary.TryRemove(taskId, out _);

                    return new MessageModel<string>() { success = false, msg = $"任务已停止,{StepName}【{existingTaskInfo.StartTime.ToString("MM月dd日HH:mm:ss")}/{maxGather.ToString("MM月dd日HH:mm:ss")}】,已采集时间【{elapsedTimeFormatted}】!" };
                }

        //取消当前表单其他所有正在运行的任务
        foreach (var key in TaskDictionary.Keys)
                {
                    //只取消当前表单的任务
                    if (!key.Contains(m.FormGuid)) continue;

                    var taskInfo = TaskDictionary[key];
                    taskInfo.Cts.Cancel(); // 取消任务
                    try
                    {
                        await taskInfo.Task; // 等待任务完成或取消
                    }
                    catch (OperationCanceledException)
                    {
                        // 处理任务取消
                        Log4netHelper.Info("任务已被取消");
                    }
                    catch (Exception ex)
                    {
                        Log4netHelper.Info(ex.Message);
                    }
                    TaskDictionary.TryRemove(key, out _);
                }

        // 创建新的取消令牌源
        var cts = new CancellationTokenSource();

        // 启动新任务
        Task<MessageModel<string>> task = Task.Run(async () =>
                {
                    // 记录任务开始时间
                    var startTime = DateTime.Now;
                    // 开始采集任务
                    // 确保 DataAcquisitionAuto 在异步上下文中运行
                    var result = await dataAcquisitionServer.DataAcquisitionAuto(m, loginUser, cts.Token);
                    Log4netHelper.Info("数采执行结果-------" + HelperTools.ConvertToJson(result));
                    return result;

                }, cts.Token);

        // 存储新任务及其取消令牌源到字典中
        TaskDictionary[taskId] = (task, cts, DateTime.Now, m.CollectionDurationthis);

        retValue.success = true;
        retValue.msg = "成功";
        //UpdateLogValue(NID, retValue);
        Log4netHelper.Info("执行方法成功,即将返回数据!");
    }
    catch (Exception ex)
    {
        retValue.msg = ex.Message;
        Log4netHelper.Error("执行数据采集命令", "DataAcquisitionAuto", HelperTools.ConvertToJson(ex.Message));
    }

    return retValue;
}

/// <summary>
/// 获取数采配置信息
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
[HttpPost]
[Route("GetDataColWorkstepInfo")]
public async Task<DataColWorkstepDTO> GetDataColWorkstepInfo(ProcedureParameterRecordDTO m)
{
    var result = await dataAcquisitionServer.GetDataColWorkstepInfo(m);

    return result;
}

 

#region 获取数采配置信息
/// <summary>
/// 获取数采配置信息
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public async Task<DataColWorkstepDTO> GetDataColWorkstepInfo(ProcedureParameterRecordDTO query)
{

    var data = await BaseDal.Db.Queryable<DataColWorkstepEntity>()
                               .OrderByDescending(x => x.CreateTime)
                               .WhereIF(!string.IsNullOrEmpty(query.Nid), x => x.Nid == query.Nid)
                               .FirstAsync();

    //获取记录最新一次按钮情况
    var parmeterGatherInfo = await BaseDal.Db.Queryable<ProcedureParameterRecordEntity>()
                                     .FirstAsync(x => x.FormGuid == query.FormGuid && x.ParameterName == "LatestCollection");


    if (data == null) return new DataColWorkstepDTO();

    // 数据转换
    var dto = _mapper.Map<DataColWorkstepDTO>(data);

    if (parmeterGatherInfo != null)
    {
        dto.LatestCollection = parmeterGatherInfo.ParameterValue;
    }

    return dto;
}
#endregion

 

标签:异步,parmeterGatherInfo,C#,await,FormGuid,采集,任务,var,parmeterGather
From: https://www.cnblogs.com/sssyyds/p/18433157

相关文章

  • Leetcode 622. 设计循环队列
    1.题目基本信息1.1.题目描述设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列......
  • Leetcode 706. 设计哈希映射
    1.题目基本信息1.1.题目描述不使用任何内建的哈希表库设计一个哈希映射(HashMap)。实现MyHashMap类:MyHashMap()用空映射初始化对象voidput(intkey,intvalue)向HashMap插入一个键值对(key,value)。如果key已经存在于映射中,则更新其对应的值value。intget(in......
  • 用 pyecharts 制作地球仪
    一、2D世界地图代码frompyechartsimportoptionsasoptsfrompyecharts.chartsimportMapfrompyecharts.fakerimportFakerc=(Map(init_opts=opts.InitOpts(width='1500px',height='1200px',bg_color='#E0EEEE'))#加载世界地图实例......
  • Pycharm 远程解释器的配置
    1.确保已经安装并enable如下插件:SSHRemoteRun,Vagrant,DockerIntegration。  操作如下:File->Settings->Plugins->Installed   2.总共有四种远程解释器配置方式,此处选择使用SSH的配置。其它三种配置见https://www.jetbrains.com/help/idea/configuring-remote-pyt......
  • 使用豆包MarsCode 实现高可用扫描工具
    以下是「 豆包MarsCode 体验官」优秀文章,作者郝同学测开笔记。前言最近接触K8s,了解到K8s提供了非常方便的实现高可用的能力,再加上掘金推出「豆包MarsCode初体验」征文活动,所以打算使用豆包MarsCodeIDE来实现一个高可用扫描工具。豆包MarsCodeIDE是一个云端AIIDE平台。通......
  • Docker入门
    Dockerfile文件详解Docker的常用命令Centos7基于容器安装运行Docker私有仓库及添加认证Centos7本地安装运行Dockerregistry私有仓库及添加认证Centos下安装Docker集群管理工具ShipyardDocker镜像仓库Harbor1.7.0搭建及配置docke通信之Linux网络命名空间docke网络之bridge......
  • 实验1: C语言输入输出和简单程序编写
    任务11#include<stdio.h>2intmain()3{4printf("O\n");5printf("<H>\n");6printf("II\n");7printf("O\n");8printf("<H>\n");9printf(&q......
  • JSCH和SSHD实现密码+二次验证码登录服务器
    背景目前通过JSCH和SSHD登录服务器的方式基本都是密码或者密钥认证,但有些服务器在密码登录后会有个二次验证,一般是TOTP验证码。下面就是用xshell连接服务器后弹出的二次验证:JSCH和SSHD的官方文档没有详细的例子说明如何通过这个二次验证,研究文档的接口和参数后找到了结合密码和二次......
  • Linux CentOS 7.9 系统 免费安装 MySQL 8.0.31:简易指南
    一:MySQL介绍在当今数字化时代,MySQL已成为最流行的开源数据库之一,无论是用于开发网站应用程序、数据存储或其他多用途的数据库需求,MySQL以其强大的功能和灵活性受到了广泛的青睐。本文将带领你通过简单的步骤,免费安装MySQL8.0.31,助你轻松搭建高效的数据库环境!二:MySQL......
  • 基于 Flask 和 Vue 的 MVC 分层结构详解
    在现代web应用开发中,MVC(Model-View-Controller)架构是一种常用的设计模式。它将应用程序分为三部分:模型(Model)、视图(View)和控制器(Controller),以实现清晰的职责分离和代码的可维护性。今天,我们将详细解释如何在Flask和Vue的组合中实现这一架构。一、什么是MVC分层结构Model......