随笔 - 87  文章 - 1  评论 - 610  阅读 - 44万

线程,线程数控制!

多线程与线程池的介绍看这里
http://edobnet.cnblogs.com/archive/2005/11/29/287094.html

        //private int threadNum = 0;
        
//private AutoResetEvent myResetEvent = new AutoResetEvent(false);
        /// <summary>
        
/// 线程记数器
        
/// </summary>

        private int number = 0;

        
/// <summary>
        
/// 线程池执行
        
/// </summary>

        public void Execute()
        
{
            
int maxCount = int.Parse(ConfigurationSettings.AppSettings["Count"]);
            
int time = int.Parse(ConfigurationSettings.AppSettings["Time"]);
            
foreach (TG_EvaluteBaseDatasSet service in this)
            
{
                
                
                
//                System.Threading.ThreadStart ts = new System.Threading.ThreadStart(service.GetXMLResult);
                
//                System.Threading.Thread th = new System.Threading.Thread(ts);
                
//                th.Start();
                WaitCallback async = new WaitCallback(FExeute);

                
while(true)
                
{
                    
                    Monitor.Enter(number);
                    
if(number>maxCount)
                        Thread.Sleep(time);
                    
else
                        
break;
                    Monitor.Exit(number);
                }

                
if(ThreadPool.QueueUserWorkItem(async,service))
                    Interlocked.Increment(
ref number);
            }

            
while(true)
            
{
                
//myResetEvent.Set();
                Monitor.Enter(number);
                
if( number <= 0)
                    
break;
                
else
                    Thread.Sleep(time);
                Monitor.Exit(number);
            }

            OnTgFinishReport(
new EventArgs());

        }

        
/// <summary>
        
/// 线程执行一个计算
        
/// </summary>
        
/// <param name="Param">执行对象<see cref="GleNet.HG.HTResolver.TG_EvaluteBaseDatasSet">TG_EvaluteBaseDatasSet</see></param>

        public  void FExeute(object Param)
        
{
            
//myResetEvent.WaitOne();
            using(TG_EvaluteBaseDatasSet service = (TG_EvaluteBaseDatasSet)Param)
            
{
                service.doResult();
                writeFile(Path,service)    ;
                OnTgReport(
new ReportEvent(service.TE_PASS_RANGE,service.TE_YEAR,service.TE_MONTH,int.Parse(service.TE_I_E_FLAG),int.Parse(service.TE_ENTRY_TYPE),number));
            }

            Interlocked.Decrement(
ref number);
            Console.WriteLine(
"LEFT:"+number);
            
        }

由程序控制线程数量,并且, 由MONITOR进行保护!

posted on   edobnet  阅读(3407)  评论(2编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
< 2005年12月 >
27 28 29 30 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1 2 3 4 5 6 7

点击右上角即可分享
微信分享提示