最近整理下各类框架,学习一下欠缺的东西。因为前一年开发过java服务端,知道java有很多开源框架,但是毕竟起来也很累。

现在转回头从新审视c#,很基础,没有开源框架,因为以前它不开源,所以少,不用比较,全部自己造。

我们在开发服务端时,有一个很严重的问题,就是多线程处理。这就有个任务长期运行,频繁启动,以及超时问题。

java中的线程池很容易实现,c#中对应的就是Task,也可以。

但是我们在开发过程中遇到过一个问题,现在启用国产软件,我们采用了一些国产数据库,这些数据库在运行一段时间后,

数据库连接不返回了,一直卡着,一直要占用使用的线程,如果是服务端程序,这就死翘翘了,一段时间后,进程里面很有很多线程,然后变慢,然后卡死。

现在整理一个服务端框架,为了解决这类问题,我自己开发了一个线程框架库,暂时不考虑它的性能优化,已经完成,这个框架作为我的服务框架一部分,我把它抽取出来,上传GIT;

线程主要结构和使用:

1.定义5类委托,你可以提供5类委托实现出来,我没有定义为接口,因为c#里面委托更加贴合方法。你可以自己改造成接口

2.为5类委托专门写了出来委托类,就是在其中启动方法,开启线程,在线程中调用委托;把这些类统一称为TaskFutru

3.TaskFutrue等待提交处理的委托对象,一旦提交了委托就执行;如果1分钟以内没有委托提交,则退出该线程;线程销毁,设置状态

4.TaskFutrue中几个状态,分别是Cancel,Finsh,Complete,分别表示该类的使用情况

5.ExecutorsThread类是最基础的了,其中的5个方法提交5类委托对象,在方法内部,采用Task类,监视超时,一旦任务超时,则立即调用TaskFutrue中的方法,取消线程,关闭线程,其中调用了Thread.abort()方法

6.线程框架,我采用了.Net标准类型,测试发现.Net Core不支持Thread.abort(),所以在StaticThreadFactory定义了变量,

如果需要关闭线程,就增加1,如果线程自动退出则减少1,设置了一个最大值,如果计数超过最大值,在ExecutorsThread中提交处理委托,则引起异常ThreadMaxEception(自定义),需要根据自己的业务处理该异常,无非是打印异常,终止提交或者重启程序,这个只能根据自己的业务了。

7.所有TaskFutrue了都继承了接口ITaskThread

该项目暂时命名为ExecutorService;以后发现问题会持续修改更新。

我有一段时间没有关注c#了,如果c#本身已经有了该功能,或者可以简单的变相实现,或者有更加好的优秀开发组件实现了该功能,请大家留言告诉我,我也想现成的啊,不想写啊。

但是,这个类库只能在服务端使用,为啥?因为耗资源多啊,你想想,你调用执行是不是要使用一个线程,底层执行委托是不是一个线程,然后监视超时是不是一个线程。也就是整个超时执行控制需要3个线程来完成一个任务。所以出来混是要换的。

项目地址:

https://github.com/jinyuttt/ExecutorService.git
---------------------
作者:jason成都
来源:CSDN
原文:https://blog.csdn.net/jinyuttt/article/details/82927398?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!

c# 任务超时执行组件的更多相关文章

  1. c# 任务超时执行

    最近整理下各类框架,学习一下欠缺的东西.因为前一年开发过java服务端,知道java有很多开源框架,但是毕竟起来也很累. 现在转回头从新审视c#,很基础,没有开源框架,因为以前它不开源,所以少,不用比 ...

  2. php运用curl触发后台脚本不超时执行某项任务

    运用curl 设置超时,触发后台脚本执行 例如一些需要长时间等待的任务,如创建数据库,下载网络图片等 $ch = curl_init();//$ch资源可以请求多个连接 curl_setopt($ch ...

  3. 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度

    http://www.cnblogs.com/bobositlife/p/aspnet-mvc-csharp-quartz-net-timer-task-scheduler.html 在之前的文章&l ...

  4. C# 给某个方法设定执行超时时间 C#如何控制方法的执行时间,超时则强制退出方法执行 C#函数运行超时则终止执行(任意参数类型及参数个数通用版)

    我自己写的 /// <summary> /// 函数运行超时则终止执行(超时则返回true,否则返回false) /// </summary> /// <typepara ...

  5. 转 C# 给某个方法设定执行超时时间

    在某些情况下(例如通过网络访问数据),常常不希望程序卡住而占用太多时间以至于造成界面假死. 在这时.我们可以通过Thread.Thread + Invoke(UI)或者是 delegate.Begin ...

  6. JMeter学习-005-JMeter 主要组件概要介绍及执行顺序

    本文将对 JMeter 主要组件(主要涉及 Threads(Users).Test Fragment.逻辑控制器.配置元件.定时器.前置处理器.Sampler.后置处理器.断言.监听器 十大组件)进行 ...

  7. Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)

    1. Future接口简介 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API ...

  8. Spring Cloud各组件超时总结

    Ribbon的超时 全局设置: ribbon: ReadTimeout: 60000 ConnectTimeout: 60000 1 2 3 局部设置: service-id: ribbon: Rea ...

  9. Java程序执行超时——Future接口介绍

    在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API的一部分,在java.uti ...

随机推荐

  1. .net比较两个时间的大小,不含日期,精确到分

    解决方案: 1.将要比较的两个时间转成DateTime类型: DateTime date1 = DateTime.Parse("8:00"); DateTime date2 = D ...

  2. C#学习笔记7

    1.重写GetHashCode方法注意点: (1)重写GetHashCode方法,也应重写Equals方法,否者编译器会警告. (2)相等的对象必须有相等的散列码(若a.Equals(b),则a.Ge ...

  3. 移除script标签引起的兼容性问题

    一.应用场景: 有时候我们需要动态创建script标签实现脚本的按需加载,我们会为script标签绑定onload或者onreadystatechange事件,用于检测动态脚本是否加载并执行完毕,在事 ...

  4. java消息中间件 RocketMQ Linux安装与运行

    阿里巴巴宣布捐赠RocketMQ到Apache软件基金会孵化项目,最近闲下来便去部署了一个试验版本玩玩. 至于RockeMQ是什么,原理架构什么的这里就不赘述了,这里只记录安装过程. 一.系统环境 s ...

  5. css-css简介

    CSS:层叠样式表 ** 层叠:一层一层的 ** 样式表:很多的属性和属性值 * 使页面显示效果更好 * CSS将网页内容和显示样式进行分离,提高了显示功能.

  6. UITableViewCell 分割线如何满屏

    在iOS7中,UITableViewCell左侧会有默认15像素的空白.设置setSeparatorInset:UIEdgeInsetsZero 能将空白去掉. 但是在iOS8中,设置setSepar ...

  7. 【Eclipse】在Eclipse上安装Spket

     转自:https://www.cnblogs.com/HDK2016/p/7099383.html 1,Spket是什么? Spket是一种编辑javaScript和XML代码的工具,可以用他自己的 ...

  8. LDA概率图模型之贝叶斯理解

    贝叶斯.概率分布与机器学习 转自:http://www.cnblogs.com/LeftNotEasy/archive/2010/09/27/1837163.html  本文由LeftNotEasy原 ...

  9. HttpWebResponse对gzip格式返回结果的处理

    HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); HttpWebRes ...

  10. 缓存溢出Buffer Overflow

    缓存溢出(Buffer overflow),是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址.在某些情况下,这些过量的字符能够作为“可执行”代码来运 ...