zoukankan      html  css  js  c++  java
  • c# 简单任务控制

    public class taskTest
        {
            private int _taskNums = 100; //初始化100个任务
            private Semaphore _semaphpre; //信号量控制任务并发的数量
            private const int _max = 5; //最大任务并发数
            private Hashtable _taskList = Hashtable.Synchronized(new Hashtable()); //任务集合
            private string _taskName = "task_";
            public EventHandler evt;
            private TaskStatus _mStaus; //主任务状态
            private CancellationTokenSource _cts;
            private ManualResetEvent _mre;
            public taskTest(){
                _semaphpre = new Semaphore(_max, _max);
                _cts = new CancellationTokenSource();
                _mre = new ManualResetEvent(false);
                
            }
            public void startTask(){
                _mre.Set();
                Task.Factory.StartNew(()=>MainTaskControl());
                _mStaus = TaskStatus.Running;
            }
            private void MainTaskControl(){
                for (int i = 0; i < _taskNums; i++) {
                    if (_cts.Token.IsCancellationRequested) {
                        _mStaus = TaskStatus.Stopped;
                        break;
                    }
                    _mre.WaitOne();
                    
                    _semaphpre.WaitOne();    
                    string tmpName = _taskName + i.ToString();
                    taskInfoMsg msg = new taskInfoMsg(tmpName, TaskStatus.Running.ToString(), i);
                    Task t = Task.Factory.StartNew(()=>tasktask(msg), _cts.Token);
                    _taskList.Add(tmpName, t);
                }
            }
            public void Close(){
                if(_semaphpre != null){
                    _semaphpre.Close();
                }
                if(_cts != null){
                    _cts.Dispose();
                }
                if(_mre != null){
                    _mre.Close();
                }
            }
            private async Task tasktask(taskInfoMsg msg){
                int count = 0;
                while (count < 5) { // 
                    if(_cts.Token.IsCancellationRequested){
                        break; //跳出循环
                    }
                    if(_mStaus == TaskStatus.Suspend){
                        evt(this, new taskInfoMsg(msg._taskName, TaskStatus.Suspend.ToString(), msg._taskID));
                    }
                    _mre.WaitOne(); //任务暂停控制
                    evt(this, new taskInfoMsg(msg._taskName, TaskStatus.Running.ToString(), msg._taskID));
                    await Task.Delay(TimeSpan.FromSeconds(1)); // 模拟耗时操作
                    
                    count ++;
                }
                _semaphpre.Release();
                evt(this, new taskInfoMsg(msg._taskName, TaskStatus.Stopped.ToString(), msg._taskID));
            }
            public int GetLiveTaskCount(){
                if(_taskList.IsSynchronized){
                    return _taskList.Count;
                }
                return _taskList.Count;
            }
            public void suspendTask(){
                    _mre.Reset();
                    _mStaus = TaskStatus.Suspend;
            }
            public void ContinueTask(){
                    _mre.Set();
                    _mStaus = TaskStatus.Running;
            }
            public void CancelTask(){
                if(_mStaus == TaskStatus.Running || _mStaus == TaskStatus.Suspend){
                    _cts.Cancel();
                }
            }
        
            
        }
        enum TaskStatus{
            Running,
            Stopped,
            Suspend
        }
        public class taskInfoMsg : EventArgs{
            public string _taskName{get; set;}
            public string _taskStatus{get; set;}
            public int _taskID{get; set;}
            public taskInfoMsg(string taskName, string taskStatus, int taskID){
                this._taskName = taskName;
                this._taskStatus = taskStatus;
                this._taskID = taskID;
            }
        }
    }
  • 相关阅读:
    leetcode 子集
    leetcode 1111. 有效括号的嵌套深度
    leetcode289 生命游戏
    关于三次握手和四次挥手,发送方和接收方处于的状态的问题。
    面试题:随意取数
    2020/3/31
    01背包和完全背包
    USACO Agri-Net 3.1
    mfc小计
    static 成员小记
  • 原文地址:https://www.cnblogs.com/alplf123/p/7878980.html
Copyright © 2011-2022 走看看