zoukankan      html  css  js  c++  java
  • C#多线程管理代码

        /// <summary>
        /// 多线程执行
        /// </summary>
        public class MultiThreadingWorker
        {
            /// <summary>
            /// 确保线程全部完成
            /// </summary>
            private Done m_done = null;
            private long m_startTime = 0;
            private Queue m_workload = null;
    
            public MultiThreadingWorker()
            {
                m_done = new Done();
                m_workload = new Queue();
            }
    
            /// <summary>
            /// 线程工作的内容委托
            /// </summary>
            public WorkContent workContent { get; set; }
            /// <summary>
            /// 线程数目
            /// </summary>
            public int threadCount { get; set; }
    
            private bool m_quit;
            public bool Quit
            {
                get { return m_quit; }
                set { m_quit = value; }
            }
            /// <summary>
            /// 增加工作的对象到队列
            /// </summary>
            /// <param name="work"></param>
            public void AddWork(Object work)
            {
                Monitor.Enter(this);
                m_workload.Enqueue(work);
                Monitor.Pulse(this);
                Monitor.Exit(this);
            }
            /// <summary>
            /// 从队列中取出对象
            /// </summary>
            /// <returns></returns>
            private Object ObtainWork()
            {
                Monitor.Enter(this);
                while (m_workload.Count < 1)
                {
                    Monitor.Wait(this);
                }
                Object next = m_workload.Dequeue();
    
                Monitor.Exit(this);
                return next;
            }
    
            /// <summary>
            /// 开始执行
            /// </summary>
            public void Start()
            {
                m_startTime = System.DateTime.Now.Ticks;
                m_done.Reset();
                m_quit = false;
    
                for (int i = 1; i <= threadCount; i++)
                {
                    ThreadStart ts = new ThreadStart(this.Process);
                    Thread m_thread = new Thread(ts);
                    m_thread.Start();
                }
    
                m_done.WaitBegin();
                m_done.WaitDone();
            }
    
            /// <summary>
            /// 停止执行
            /// </summary>
            public void Stop()
            {
                m_quit = true;
            }
    
            private void Process()
            {
                while (m_quit==false)
                {
                    Object workobj = ObtainWork();
                    m_done.WorkerBegin();
                    try
                    {
                        workContent(workobj);
                    }
                    catch (Exception e)
                    {
                        System.Console.WriteLine(" Error:" + e.Message);
                    }
                    finally
                    {
                        m_done.WorkerEnd();
                    }
                }
            }
        }
    
        /// <summary>
        /// 执行内容适用委托
        /// </summary>
        /// <param name="work"></param>
        public delegate void WorkContent(Object work);
    
        public class Done 
        {
            private int m_activeThreads = 0;
            private bool m_started = false;
    
    
            public void WaitDone()
            {
                Monitor.Enter(this);
                while ( m_activeThreads>0 ) 
                {
                    Monitor.Wait(this);
                }
                Monitor.Exit(this);
            }
    
            public void WaitBegin()
            {
                Monitor.Enter(this);
                while ( !m_started ) 
                {
                    Monitor.Wait(this);
                }
                Monitor.Exit(this);
            }
    
    
            /// <summary>
            /// 执行开始
            /// </summary>
            public void WorkerBegin()
            {
                Monitor.Enter(this);
                m_activeThreads++;
                m_started = true;
                Monitor.Pulse(this);
                Monitor.Exit(this);
            }
    
            /// <summary>
            /// 执行完成
            /// </summary>
            public void WorkerEnd()
            {
                Monitor.Enter(this);
                m_activeThreads--;
                Monitor.Pulse(this);
                Monitor.Exit(this);
            }
    
            /// <summary>
            /// 重新初始化
            /// </summary>
            public void Reset()
            {
                Monitor.Enter(this);
                m_activeThreads = 0;
                Monitor.Exit(this);
            }
        }

    调用代码:

    public class TestMultiThreading
        {
            public static void Test()
            {
                MultiThreadingWorker thWork = new MultiThreadingWorker();
                thWork.threadCount = 20;
                thWork.workContent = new WorkContent(WorkFun);
                for (int i = 0; i < 100; i++)
                    thWork.AddWork(i);
                thWork.Start();
            }
    
            private static void WorkFun(object obj)
            {
                Console.WriteLine("执行内容:" + obj.ToString());
            }
        }

  • 相关阅读:
    PEP20: The Zen of Python
    画三角形
    前端优化总结
    Doctype的作用以及严格模式和混杂模式的区别
    JS循环添加事件
    数据库整理用到的
    ASP.NET中url路径中?和= 被转码成%3f 和 %3d带来的问题。
    ReSharper Abbreviations List, 怎么管理缩写列表
    怎样使用 ASP.NET Optimization Bundling压缩样式表和脚本
    jQuery 选择同时包含两个class的元素
  • 原文地址:https://www.cnblogs.com/kakake/p/4151691.html
Copyright © 2011-2022 走看看