using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp7
{
    public class TaskManage
    {
        public int maxcount;
        public int countnum = 0;
        public TaskManage(int worknum)
        {
            maxcount = worknum;
        }

        public void Run(Action< object> func, object s)
        {
            while (countnum >= maxcount)
            {
                Thread.Sleep(5);
            }
            lock (this)
            {
                countnum++;
            }
            Task task = new Task(() =>
            {
                func(s);
                lock (this)
                {
                    countnum--;
                }
            });
            task.Start();

        }

        public void WaitComplete()
        {
            while (countnum > 0)
            {
                Console.WriteLine("***************"+countnum);
                Thread.Sleep(5);

            }
        }
    }
}

  

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

namespace ConsoleApp7
{
    public class WorkBackground
    {
        public delegate void BackgroundMethod(params object[] objs);
        private int threadCount = 0;
        private int MaxThreadCount = 0;

        public WorkBackground(int maxThreadCount)
        {
            MaxThreadCount = maxThreadCount;
        }

        public void Run(BackgroundMethod backgroundMethod, params object[] objs)
        {
            while (threadCount >= MaxThreadCount)
            { Thread.Sleep(5); }

            lock (this) { threadCount++; }

            Thread thread = new Thread((object threadObj) =>
            {
                if (threadObj as object[] != null)
                { backgroundMethod(threadObj as object[]); }
                else
                { backgroundMethod(); }

                lock (this) { threadCount--; }
            });
            thread.IsBackground = true;
            thread.Start(objs);
        }

        public void WaitComplete()
        {
            while (threadCount > 0)
            { Thread.Sleep(5); }
        }
    }
}

  调用

 //第一种
            //TaskManage taskManage = new TaskManage(5);
            //for (int i = 0; i < 10000; i++)
            //{
            //    taskManage.Run(delegate (object[] s)
            //    {
            //        Console.WriteLine("s:" + s);
            //    }, i);

            //}
            //taskManage.WaitComplete();
            //Console.ReadKey();

            //第二种
            WorkBackground taskManage = new WorkBackground(5);
            for (int i = 0; i < 10000; i++)
            {
                taskManage.Run(delegate (object[] s)
                {
                    Console.WriteLine("s:" + s[0]);
                }, i);

            }
            taskManage.WaitComplete();
            Console.ReadKey();

  

线程——自定义多线程task的更多相关文章

  1. C#中的线程(下)-多线程

    1.  单元模式和Windows Forms 单元模式线程是一个自动线程安全机制, 非常贴近于COM——Microsoft的遗留下的组件对象模型.尽管.NET最大地放弃摆脱了遗留下的模型,但很多时候它 ...

  2. 【温故而知新-万花筒】C# 异步编程 逆变 协变 委托 事件 事件参数 迭代 线程、多线程、线程池、后台线程

    额基本脱离了2.0 3.5的时代了.在.net 4.0+ 时代.一切都是辣么简单! 参考文档: http://www.cnblogs.com/linzheng/archive/2012/04/11/2 ...

  3. C# 多线程task

    1.异步和多线程的区别?没什么太大区别.异步是目的,使用多线程实现.想想AJAX异步加载,不就是不想让浏览器界面卡住嘛,所以在程序中对于某些单独的操作,比如写日志,我们不想等它完成后再执行其它操作(因 ...

  4. Java线程和多线程(一)——线程的基本概念

    Java 线程是一个轻量级执行任务的处理单元.Java提供了Thread类来支持多线程,开发者在应用中可以创建多个线程来支持并发执行任务. 在应用中存在两种类型的线程,用户线程和守护线程.当我们启动应 ...

  5. python——线程与多线程基础

    我们之前已经初步了解了进程.线程与协程的概念,现在就来看看python的线程.下面说的都是一个进程里的故事了,暂时忘记进程和协程,先来看一个进程中的线程和多线程.这篇博客将要讲一些单线程与多线程的基础 ...

  6. 在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析

    首先关于在python中单线程,多线程,多进程对cpu的利用率实测如下: 单线程,多线程,多进程测试代码使用死循环. 1)单线程: 2)多线程: 3)多进程: 查看cpu使用效率: 开始观察分别执行时 ...

  7. Java多线程父子线程关系 多线程中篇(六)

    有的时候对于Java多线程,我们会听到“父线程.子线程”的概念. 严格的说,Java中不存在实质上的父子关系 没有方法可以获取一个线程的父线程,也没有方法可以获取一个线程所有的子线程 子线程的消亡与父 ...

  8. java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)

    今天开始就来总结一下Java多线程的基础知识点,下面是本篇的主要内容(大部分知识点参考java核心技术卷1): 1.什么是线程以及多线程与进程的区别 2.多线程的创建与启动 3.中断线程和守护线程以及 ...

  9. C#多线程编程(1)--线程,线程池和Task

    新开了一个多线程编程系列,该系列主要讲解C#中的多线程编程.    利用多线程的目的有2个: 一是防止UI线程被耗时的程序占用,导致界面卡顿:二是能够利用多核CPU的资源,提高运行效率. 我没有进行很 ...

随机推荐

  1. cent os 7 与cent os 6区别

    原文地址:https://www.cnblogs.com/Csir/p/6746667.html 前言 centos7与6之间最大的差别就是初始化技术的不同,7采用的初始化技术是Systemd,并行的 ...

  2. C# -- 使用FileInfo获取文件信息

    C# -- 使用FileInfo获取文件信息 1. 代码实现 static void Main(string[] args) { GetFileInfo(@"D:\Test.xlsx&quo ...

  3. Linux:Day20(上) openssh和CA

    ssh:secure shell protocol,22/tcp,安全的远程登陆 OpenSSH:ssh协议的开源实现: dripbear:另一个开源实现: SSH协议版本 v1:基于CRC-32做M ...

  4. [解读REST] 2.REST用来干什么的?

    衔接上文[解读REST] 1.REST的起源,介绍了REST的诞生背景.每当笔者遇到一个新事物的想去了解的时候,总是会问上自己第一个问题,这个新事物是干什么用的?在解释我所理解的REST这个过程中也不 ...

  5. JS 设计模式六 -- 代理模式

    概念 为一个对象提供一个代用品或占位符,以便控制对它的访问. 当客户不方便直接访问一个对象的时候,需要提供一个替身对象来控制对这个对象的访问. 替身对象对请求做出一些处理之后, 再把请求转交给本体对象 ...

  6. ansible copy 模块详解

    ansible 模块 copy one.概述 copy 模块的作用就是拷贝文件,它与之前介绍过的 fetch 模块类似,不过,fetch 模块是从远程主机中拉取文件到 ansible 管理主机,而 c ...

  7. gitlab搭建和使用

    原文地址:https://blog.csdn.net/zhushuai662/article/details/79581377 大家常听说Git.Github.Gitlab,很多人对着三个词很懵逼,分 ...

  8. vue中watch检测到不到对象属性的变化的解决方法

    watch: { option: { handler(newVal) { console.log(newVal); }, deep: true, immediate: true } }, 需要深层wa ...

  9. Pod install Error List

    1. Error installing Crashlytics while executing pod install [!] Error installing Crashlytics [!] /us ...

  10. 使用Docker安装Oracle数据库

    在很多时候,我们需要在本地安装Oracle数据库,但是整个安装的过程时间非常长而且安装文件大,那么有不有更好的办法来安装Oracle数据库既能减少安装的时间而且还能够快速进行部署呢?答案就是使用Doc ...