首页 > 编程语言 >C#管理异步线程

C#管理异步线程

时间:2024-05-30 16:58:04浏览次数:23  
标签:异步 Task string C# static 线程 TaskName public

管理异步线程

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace PortClient
{
    /// <summary>
    /// 异步线程
    /// *修改为枚举类型更合理
    /// </summary>
    public static class TaskWorkType
    {
        public static string WCFHeartBit = "WCFHeartBit";
        public static string Alarm = "AlarmEngine";
        public static string Upload = "Upload";
        public static string SysStatus = "SysStatus";
        public static string OPCServer = "OPCServer";
        public static string StationState = "StationState";
        public static string PLC = "PLC";
        public static string HistoryClear = "HistoryClear";
        //public static string WCFHeartBit = "WCFHeartBit";
    }
    /// <summary>
    /// 工作任务
    /// </summary>
    public class TaskWork
    {
        #region 属性
        /// <summary>中断 </summary>
        public bool Stop = false;
        /// <summary>线程结束回调 </summary>
        public static event Action<TaskWork> TaskEndEventHandler;
        public Task Task { get; }
        public string TaskName { get; }

        /// <summary>取消线程标记</summary>
        public CancellationTokenSource CTS { get; private set; } = new CancellationTokenSource();
        #endregion
        /// <summary>
        /// 创建运行任务
        /// </summary>
        /// <param name="doWork"></param>
        /// <param name="taskName"></param>
        public TaskWork(Action<TaskWork> doWork, string taskName)
        {
            var token = CTS.Token;
            TaskName = taskName;
            var action = new Action(() =>
            {
                doWork.Invoke(this);
            });
            Task = new Task(action, token, TaskCreationOptions.LongRunning);
            //添加线程事件
            Task.ContinueWith(t =>
            {
                if (t.IsCompleted)
                {
                    Console.WriteLine($"{TaskName} Task completed successfully.");
                }
                else if (t.IsCanceled)
                {
                    Console.WriteLine($"{TaskName} Task was canceled.");
                }
                else if (t.IsFaulted)
                {
                    Console.WriteLine($"{TaskName} Task faulted with exception: " + t.Exception.InnerException.Message);
                }
                //线程结束事件回调
                TaskWork.TaskEndEventHandler?.Invoke(this);
                TaskEndEventHandler?.Invoke(this);
            }).ContinueWith(t =>
            {
                Console.WriteLine("释放内存");//待实现
            });
            Task.Start();
        }

        #region 静态函数
        /// <summary>
        /// 取消所有线程
        /// </summary>
        public static void CancelThread()
        {
            //CTS.Cancel();
            //CTS.CancelAfter(10000);
            TaskDic1.Values.ToList().ForEach(task =>
            {
                task.Stop = true;
                task.CTS.CancelAfter(5000);
            });
        }
        /// <summary>
        /// 等待所有线程结束
        /// 
        /// 使用示例:TaskWork.RunCTS(DBTaskRunningBody, TaskWorkType.Alarm);
        /// 结束所有线程示例: TaskWork.CancelThread();
        /// </summary>
        public static void WaitAllEnd()
        {
            TaskDic1.Values.ToList().ForEach(task =>
            {
                task.Stop = true;//
                task.CTS.CancelAfter(1000);//不管有没有完成,强制3秒后退出
            });
            //等待所有线程结束
            //Task.WaitAll(TaskDic1.Values.Select(a => a.Task).ToArray(), 3000);
            Task.WaitAll(TaskDic1.Values.Select(a => a.Task).ToArray());
        }
        public static Dictionary<string, TaskWork> TaskDic1 = new Dictionary<string, TaskWork>();
        /// <summary>
        /// 异步线程创建;<br/>
        /// --------code-----<br/>
        /// taskwork.Stop 判断是否停止运行<br/>
        /// -----------------<br/>
        /// 使用TaskHelper.CancelThread() 取消所有任务;
        /// </summary>
        /// <param name="DoWork">调用函数参数 CancellationToken</param>
        /// <param name="TaskName"></param>
        public static void RunCTS(Action<TaskWork> DoWork, string TaskName)
        {
            try
            {
                var taskItem1 = new TaskWork(DoWork, TaskName);
                TaskDic1.Add(TaskName, taskItem1);
            }
            catch (Exception ex)
            {

            }

        }
        #endregion
    }
}

 


 

标签:异步,Task,string,C#,static,线程,TaskName,public
From: https://www.cnblogs.com/orp1989/p/18222686

相关文章

  • nginx后端健康检查nginx_upstream_check_module
    一:nginx后端健康检查ngx_http_upstream_modulenginx自带健康检查的缺陷:Nginx只有当有访问时后,才发起对后端节点探测。如果本次请求中,节点正好出现故障,Nginx依然将请求转交给故障的节点,然后再转交给健康的节点处理。所以不会影响到这次请求的正常进行。但是会影响效率,因为......
  • golang开发 gorilla websocket的使用
    很多APP都需要主动向用户推送消息,这就需要用到长连接的服务,即我们通常提到的websocket,同样也是使用socket服务,通信协议是基本类似的,在go中用的最多的、也是最简单的socket服务就是gorilla/websocket,它有21.1K的star,足以说明它的受欢迎程度,它的github地址是https://github.com/g......
  • pwn学习-ret2shellcode
    今天学习了pwn中的ret2shellcode,在之前学习的ret2text中,程序给我们留下了后门函数,可以直接溢出执行,而ret2shellcode是最经典的栈溢出漏洞利用方法,简单原理如下:在栈溢出漏洞利用成功后,我们可以控制返回地址代码执行,但是这些代码在程序中默认没有,需要我们自己添加,这段代码被称为s......
  • Ubuntu18.04 + Caffe + python3.7 + CUDA11 + cuDNN8编译记录 转载文章 非原创
    背景这两天接手了一个在两年前基于caffe实现的交互式活体检测的项目,想要让他在python3和CUDA11的环境下运行。但是呢,caffe已经官方宣布不再继续更新,不支持最新版的cuDNN8,那需求摆在这边只好自行想办法,前前后后倒腾了两天,可算是编译成功把项目跑通了,在此记录一下自己配置辛酸史。......
  • c# NTP 时间同步
    using System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;namespace SmartConstructionSite.Common.Helper{    public class NTPHelper    {        public const string WINDOWS_SE......
  • Ubuntu22.04安装部署基于dockers的K8s目前最新版本1.30.1版本
    其实之前也写过其他系统、其他版本的部署,但是,由于在1.28版本之后,安装略有所变化,所以,这里再写一篇基础环境主机名配置角色系统版本IP安装的组件master4核4GmasterUbuntu22.04192.168.140.75apiserver、controller-manager、scheduler、kubelet、etcd、kube-pro......
  • easyexcel导出树状结构
    主类packagecn.piesat.nj.farm.agricultural;importcom.alibaba.excel.write.metadata.fill.FillConfig;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;importorg.apache.poi.ss.usermodel.Cell;importorg.apache.poi.ss.usermodel.Row;import......
  • SQL Server报错:数据库"YourDatabaseName"的事务日志已满,原因为"LOG_BACKUP"
      通过以下代码可以收缩日志,执行完后就不报错了。--设置简单模式USE[master]GOALTERDATABASEYourDatabaseNameSETRECOVERYSIMPLEWITHNO_WAITGOALTERDATABASEYourDatabaseNameSETRECOVERYSIMPLEGO--设置压缩后的日志大小为2M,可自定义USEY......
  • c++ 模板
     来自:https://sg-first.gitbooks.io/cpp-template-tutorial/content/T_ji_ben_yu_fa.html 1.Template的基本语法1.1TemplateClass基本语法1.1.1TemplateClass的与成员变量定义我们来回顾一下最基本的TemplateClass声明和定义形式:TemplateClass声明:template<type......
  • 基于at24c02的按键检测C51程序
    1#include<reg51.h>2#include<intrins.h>3#include<lcd1602.h>4#defineucharunsignedchar5#defineuintunsignedint6#defineulongunsignedlong78#defineEEPROM_ADDR0xA09sbitSDA=P2^0;10......